/ Hex Artifact Content
Login

Artifact 08f8678d2cce51f2366ef3579fdfad9aad745b06:


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 30 20 32 30 30  in.c,v 1.130 200
01d0: 38 2f 30 37 2f 31 38 20 32 33 3a 34 37 3a 34 33  8/07/18 23:47:43
01e0: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
01f0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0200: 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45 5f  t.h".#if SQLITE_
0210: 4f 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20  OS_WIN          
0220: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c       /* This fil
0230: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69  e is used for wi
0240: 6e 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 0a  ndows only */...
0250: 2f 2a 0a 2a 2a 20 41 20 4e 6f 74 65 20 41 62 6f  /*.** A Note Abo
0260: 75 74 20 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61  ut Memory Alloca
0270: 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion:.**.** This
0280: 20 64 72 69 76 65 72 20 75 73 65 73 20 6d 61 6c   driver uses mal
0290: 6c 6f 63 28 29 2f 66 72 65 65 28 29 20 64 69 72  loc()/free() dir
02a0: 65 63 74 6c 79 20 72 61 74 68 65 72 20 74 68 61  ectly rather tha
02b0: 6e 20 67 6f 69 6e 67 20 74 68 72 6f 75 67 68 0a  n going through.
02c0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 2d 77 72  ** the SQLite-wr
02d0: 61 70 70 65 72 73 20 73 71 6c 69 74 65 33 5f 6d  appers sqlite3_m
02e0: 61 6c 6c 6f 63 28 29 2f 73 71 6c 69 74 65 33 5f  alloc()/sqlite3_
02f0: 66 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 77  free().  Those w
0300: 72 61 70 70 65 72 73 0a 2a 2a 20 61 72 65 20 64  rappers.** are d
0310: 65 73 69 67 6e 65 64 20 66 6f 72 20 75 73 65 20  esigned for use 
0320: 6f 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74  on embedded syst
0330: 65 6d 73 20 77 68 65 72 65 20 6d 65 6d 6f 72 79  ems where memory
0340: 20 69 73 20 73 63 61 72 63 65 20 61 6e 64 0a 2a   is scarce and.*
0350: 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  * malloc failure
0360: 73 20 68 61 70 70 65 6e 20 66 72 65 71 75 65 6e  s happen frequen
0370: 74 6c 79 2e 20 20 57 69 6e 33 32 20 64 6f 65 73  tly.  Win32 does
0380: 20 6e 6f 74 20 74 79 70 69 63 61 6c 6c 79 20 72   not typically r
0390: 75 6e 20 6f 6e 0a 2a 2a 20 65 6d 62 65 64 64 65  un on.** embedde
03a0: 64 20 73 79 73 74 65 6d 73 2c 20 61 6e 64 20 77  d systems, and w
03b0: 68 65 6e 20 69 74 20 64 6f 65 73 20 74 68 65 20  hen it does the 
03c0: 64 65 76 65 6c 6f 70 65 72 73 20 6e 6f 72 6d 61  developers norma
03d0: 6c 6c 79 20 68 61 76 65 20 62 69 67 67 65 72 0a  lly have bigger.
03e0: 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 74 6f 20 77  ** problems to w
03f0: 6f 72 72 79 20 61 62 6f 75 74 20 74 68 61 6e 20  orry about than 
0400: 72 75 6e 6e 69 6e 67 20 6f 75 74 20 6f 66 20 6d  running out of m
0410: 65 6d 6f 72 79 2e 20 20 53 6f 20 74 68 65 72 65  emory.  So there
0420: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6d   is not.** a com
0430: 70 65 6c 6c 69 6e 67 20 6e 65 65 64 20 74 6f 20  pelling need to 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 65 72  ..**.** But ther
0460: 65 20 69 73 20 61 20 67 6f 6f 64 20 72 65 61 73  e is a good reas
0470: 6f 6e 20 74 6f 20 6e 6f 74 20 75 73 65 20 74 68  on to not use th
0480: 65 20 77 72 61 70 70 65 72 73 2e 20 20 49 66 20  e wrappers.  If 
0490: 77 65 20 75 73 65 20 74 68 65 0a 2a 2a 20 77 72  we use the.** wr
04a0: 61 70 70 65 72 73 20 74 68 65 6e 20 77 65 20 77  appers then we w
04b0: 69 6c 6c 20 67 65 74 20 73 69 6d 75 6c 61 74 65  ill get simulate
04c0: 64 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  d malloc() failu
04d0: 72 65 73 20 77 69 74 68 69 6e 20 74 68 69 73 0a  res within this.
04e0: 2a 2a 20 64 72 69 76 65 72 2e 20 20 41 6e 64 20  ** driver.  And 
04f0: 74 68 61 74 20 63 61 75 73 65 73 20 61 6c 6c 20  that causes all 
0500: 6b 69 6e 64 73 20 6f 66 20 70 72 6f 62 6c 65 6d  kinds of problem
0510: 73 20 66 6f 72 20 6f 75 72 20 74 65 73 74 73 2e  s for our tests.
0520: 20 20 57 65 0a 2a 2a 20 63 6f 75 6c 64 20 65 6e    We.** could en
0530: 68 61 6e 63 65 20 53 51 4c 69 74 65 20 74 6f 20  hance SQLite to 
0540: 64 65 61 6c 20 77 69 74 68 20 73 69 6d 75 6c 61  deal with simula
0550: 74 65 64 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  ted malloc failu
0560: 72 65 73 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  res within.** th
0570: 65 20 4f 53 20 64 72 69 76 65 72 2c 20 62 75 74  e OS driver, but
0580: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 65 61   the code to dea
0590: 6c 20 77 69 74 68 20 74 68 6f 73 65 20 66 61 69  l with those fai
05a0: 6c 75 72 65 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  lure would not.*
05b0: 2a 20 62 65 20 65 78 65 72 63 69 73 65 64 20 6f  * be exercised o
05c0: 6e 20 4c 69 6e 75 78 20 28 77 68 69 63 68 20 64  n Linux (which d
05d0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
05e0: 6d 61 6c 6c 6f 63 28 29 20 69 6e 20 74 68 65 20  malloc() in the 
05f0: 64 72 69 76 65 72 29 0a 2a 2a 20 61 6e 64 20 73  driver).** and s
0600: 6f 20 77 65 20 77 6f 75 6c 64 20 68 61 76 65 20  o we would have 
0610: 64 69 66 66 69 63 75 6c 74 79 20 77 72 69 74 69  difficulty writi
0620: 6e 67 20 63 6f 76 65 72 61 67 65 20 74 65 73 74  ng coverage test
0630: 73 20 66 6f 72 20 74 68 61 74 0a 2a 2a 20 63 6f  s for that.** co
0640: 64 65 2e 20 20 42 65 74 74 65 72 20 74 6f 20 6c  de.  Better to l
0650: 65 61 76 65 20 74 68 65 20 63 6f 64 65 20 6f 75  eave the code ou
0660: 74 2c 20 77 65 20 74 68 69 6e 6b 2e 0a 2a 2a 0a  t, we think..**.
0670: 2a 2a 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20  ** The point of 
0680: 74 68 69 73 20 64 69 73 63 75 73 73 69 6f 6e 20  this discussion 
0690: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 20  is as follows:  
06a0: 57 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20  When creating a 
06b0: 6e 65 77 0a 2a 2a 20 4f 53 20 6c 61 79 65 72 20  new.** OS layer 
06c0: 66 6f 72 20 61 6e 20 65 6d 62 65 64 64 65 64 20  for an embedded 
06d0: 73 79 73 74 65 6d 2c 20 69 66 20 79 6f 75 20 75  system, if you u
06e0: 73 65 20 74 68 69 73 20 66 69 6c 65 20 61 73 20  se this file as 
06f0: 61 6e 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61  an example,.** a
0700: 76 6f 69 64 20 74 68 65 20 75 73 65 20 6f 66 20  void the use of 
0710: 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65 28 29 2e  malloc()/free().
0720: 20 20 54 68 6f 73 65 20 72 6f 75 74 69 6e 65 73    Those routines
0730: 20 77 6f 72 6b 20 6f 6b 20 6f 6e 20 77 69 6e 64   work ok on wind
0740: 6f 77 73 0a 2a 2a 20 64 65 73 6b 74 6f 70 73 20  ows.** desktops 
0750: 62 75 74 20 6e 6f 74 20 73 6f 20 77 65 6c 6c 20  but not so well 
0760: 69 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74  in embedded syst
0770: 65 6d 73 2e 0a 2a 2f 0a 0a 23 69 6e 63 6c 75 64  ems..*/..#includ
0780: 65 20 3c 77 69 6e 62 61 73 65 2e 68 3e 0a 0a 23  e <winbase.h>..#
0790: 69 66 64 65 66 20 5f 5f 43 59 47 57 49 4e 5f 5f  ifdef __CYGWIN__
07a0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
07b0: 63 79 67 77 69 6e 2e 68 3e 0a 23 65 6e 64 69 66  cygwin.h>.#endif
07c0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75  ../*.** Macros u
07d0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
07e0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
07f0: 74 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e 0a  to use threads..
0800: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54  */.#if defined(T
0810: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48  HREADSAFE) && TH
0820: 52 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e  READSAFE.# defin
0830: 65 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52  e SQLITE_W32_THR
0840: 45 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  EADS 1.#endif../
0850: 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64  *.** Include cod
0860: 65 20 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e  e that is common
0870: 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66   to all os_*.c f
0880: 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  iles.*/.#include
0890: 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a   "os_common.h"..
08a0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
08b0: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
08c0: 67 20 77 69 74 68 20 57 69 6e 64 6f 77 73 43 45  g with WindowsCE
08d0: 20 2d 20 77 68 69 63 68 20 68 61 73 20 61 20 6d   - which has a m
08e0: 75 63 68 0a 2a 2a 20 72 65 64 75 63 65 64 20 41  uch.** reduced A
08f0: 50 49 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  PI..*/.#if defin
0900: 65 64 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  ed(SQLITE_OS_WIN
0910: 43 45 29 0a 23 20 64 65 66 69 6e 65 20 41 72 65  CE).# define Are
0920: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 31  FileApisANSI() 1
0930: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
0940: 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76  inCE lacks nativ
0950: 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69  e support for fi
0960: 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65  le locking so we
0970: 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74   have to fake it
0980: 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f  .** with some co
0990: 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a  de of our own..*
09a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
09b0: 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74  WINCE.typedef st
09c0: 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b  ruct winceLock {
09d0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b  .  int nReaders;
09e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
09f0: 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73   of reader locks
0a00: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
0a10: 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20  OOL bPending;   
0a20: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
0a30: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  a pending lock h
0a40: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
0a50: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65   */.  BOOL bRese
0a60: 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64  rved;     /* Ind
0a70: 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76 65  icates a reserve
0a80: 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  d lock has been 
0a90: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f  obtained */.  BO
0aa0: 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20  OL bExclusive;  
0ab0: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61    /* Indicates a
0ac0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0ad0: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0ae0: 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63  ed */.} winceLoc
0af0: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  k;.#endif../*.**
0b00: 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72   The winFile str
0b10: 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63  ucture is a subc
0b20: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
0b30: 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74  file* specific t
0b40: 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70  o the win32.** p
0b50: 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72  ortability layer
0b60: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0b70: 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46  uct winFile winF
0b80: 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46  ile;.struct winF
0b90: 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71  ile {.  const sq
0ba0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0bb0: 20 2a 70 4d 65 74 68 6f 64 3b 2f 2a 20 4d 75 73   *pMethod;/* Mus
0bc0: 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20  t be first */.  
0bd0: 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20  HANDLE h;       
0be0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
0bf0: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
0c00: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
0c10: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b  signed char lock
0c20: 74 79 70 65 3b 20 2f 2a 20 54 79 70 65 20 6f 66  type; /* Type of
0c30: 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20   lock currently 
0c40: 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c  held on this fil
0c50: 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61  e */.  short sha
0c60: 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f  redLockByte;   /
0c70: 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65  * Randomly chose
0c80: 6e 20 62 79 74 65 20 75 73 65 64 20 61 73 20 61  n byte used as a
0c90: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
0ca0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
0cb0: 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44 65  NCE.  WCHAR *zDe
0cc0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a  leteOnClose;  /*
0cd0: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
0ce0: 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c 6f   delete when clo
0cf0: 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  sing */.  HANDLE
0d00: 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20   hMutex;        
0d10: 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64 20    /* Mutex used 
0d20: 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
0d30: 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63 6b  s to shared lock
0d40: 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20 68   */  .  HANDLE h
0d50: 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20 20  Shared;         
0d60: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
0d70: 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66 6f   segment used fo
0d80: 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 77  r locking */.  w
0d90: 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b 20  inceLock local; 
0da0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73 20         /* Locks 
0db0: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69 73  obtained by this
0dc0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69 6e   instance of win
0dd0: 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65 4c  File */.  winceL
0de0: 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20 20  ock *shared;    
0df0: 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61 72    /* Global shar
0e00: 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20 66  ed lock memory f
0e10: 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f 0a  or the file  */.
0e20: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  #endif.};.../*.*
0e30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
0e40: 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72  variable is (nor
0e50: 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20  mally) set once 
0e60: 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65  and never change
0e70: 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e  s.** thereafter.
0e80: 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65    It records whe
0e90: 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  ther the operati
0ea0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
0eb0: 39 35 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a  95.** or WinNT..
0ec0: 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61  **.** 0:   Opera
0ed0: 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e  ting system unkn
0ee0: 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65  own..** 1:   Ope
0ef0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
0f00: 20 57 69 6e 39 35 2e 0a 2a 2a 20 32 3a 20 20 20   Win95..** 2:   
0f10: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
0f20: 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   is WinNT..**.**
0f30: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   In order to fac
0f40: 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20  ilitate testing 
0f50: 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65  on a WinNT syste
0f60: 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74  m, the test fixt
0f70: 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61  ure.** can manua
0f80: 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c  lly set this val
0f90: 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61  ue to 1 to emula
0fa0: 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f  te Win98 behavio
0fb0: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
0fc0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
0fd0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
0fe0: 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69  ;.#else.static i
0ff0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1000: 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  pe = 0;.#endif..
1010: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
1020: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
1030: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
1040: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
1050: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
1060: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
1070: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
1080: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
1090: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
10a0: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
10b0: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
10c0: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
10d0: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
10e0: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
10f0: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
1100: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
1110: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
1120: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
1130: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
1140: 27 74 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72  't call it win r
1150: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
1160: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
1170: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
1180: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
1190: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
11a0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
11b0: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
11c0: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
11d0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
11e0: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
11f0: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
1200: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
1210: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
1220: 53 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65  S_WINCE.# define
1230: 20 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c   isNT()  (1).#el
1240: 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  se.  static int 
1250: 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20  isNT(void){.    
1260: 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  if( sqlite3_os_t
1270: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1280: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49  OSVERSIONINFO sI
1290: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
12a0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
12b0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
12c0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56  nfo);.      GetV
12d0: 65 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29  ersionEx(&sInfo)
12e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12f0: 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e  os_type = sInfo.
1300: 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45  dwPlatformId==VE
1310: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
1320: 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20  _NT ? 2 : 1;.   
1330: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71   }.    return sq
1340: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32  lite3_os_type==2
1350: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1360: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1370: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
1380: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
1390: 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e   to microsoft un
13a0: 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e  icode (UTF-16?).
13b0: 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f   .**.** Space to
13c0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
13d0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
13e0: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
13f0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48  c..*/.static WCH
1400: 41 52 20 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64  AR *utf8ToUnicod
1410: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
1420: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
1430: 6e 43 68 61 72 3b 0a 20 20 57 43 48 41 52 20 2a  nChar;.  WCHAR *
1440: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a  zWideFilename;..
1450: 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69 42    nChar = MultiB
1460: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
1470: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
1480: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
1490: 29 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  );.  zWideFilena
14a0: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68  me = malloc( nCh
14b0: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
14c0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
14d0: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
14e0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
14f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
1500: 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  ar = MultiByteTo
1510: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
1520: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
1530: 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
1540: 65 2c 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28  e, nChar);.  if(
1550: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
1560: 20 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e   free(zWideFilen
1570: 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46  ame);.    zWideF
1580: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
1590: 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46  .  return zWideF
15a0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
15b0: 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73  * Convert micros
15c0: 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20 55  oft unicode to U
15d0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
15e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
15f0: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
1600: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
1610: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
1620: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f   char *unicodeTo
1630: 55 74 66 38 28 63 6f 6e 73 74 20 57 43 48 41 52  Utf8(const WCHAR
1640: 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29   *zWideFilename)
1650: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
1660: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1670: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64  ;..  nByte = Wid
1680: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
1690: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
16a0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
16b0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a  0, 0, 0, 0);.  z
16c0: 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  Filename = mallo
16d0: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
16e0: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
16f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1700: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 57 69    }.  nByte = Wi
1710: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
1720: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
1730: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
1740: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74   zFilename, nByt
1750: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
1780: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
1790: 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  free(zFilename);
17a0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
17b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
17c0: 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f   zFilename;.}../
17d0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
17e0: 61 6e 73 69 20 73 74 72 69 6e 67 20 74 6f 20 6d  ansi string to m
17f0: 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65  icrosoft unicode
1800: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
1810: 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61  * current codepa
1820: 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20  ge settings for 
1830: 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a  file apis..** .*
1840: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
1850: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
1860: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ing is obtained.
1870: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ** from malloc..
1880: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
1890: 2a 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63  *mbcsToUnicode(c
18a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
18b0: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
18c0: 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62  te;.  WCHAR *zMb
18d0: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  csFilename;.  in
18e0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72 65  t codepage = Are
18f0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
1900: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
1910: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d  CP;..  nByte = M
1920: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
1930: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
1940: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
1950: 55 4c 4c 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43  ULL,0)*sizeof(WC
1960: 48 41 52 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c  HAR);.  zMbcsFil
1970: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
1980: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62  nByte*sizeof(zMb
1990: 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29  csFilename[0]) )
19a0: 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69 6c  ;.  if( zMbcsFil
19b0: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
19c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19d0: 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74  nByte = MultiByt
19e0: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
19f0: 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  page, 0, zFilena
1a00: 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c  me, -1, zMbcsFil
1a10: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20  ename, nByte);. 
1a20: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
1a30: 0a 20 20 20 20 66 72 65 65 28 7a 4d 62 63 73 46  .    free(zMbcsF
1a40: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
1a50: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
1a60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
1a70: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
1a80: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69  /*.** Convert mi
1a90: 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20  crosoft unicode 
1aa0: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
1ab0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62  racter string, b
1ac0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75  ased on the.** u
1ad0: 73 65 72 27 73 20 41 6e 73 69 20 63 6f 64 65 70  ser's Ansi codep
1ae0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
1af0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
1b00: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
1b10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1b20: 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74   malloc()..*/.st
1b30: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
1b40: 64 65 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57  deToMbcs(const W
1b50: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e  CHAR *zWideFilen
1b60: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
1b70: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
1b80: 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65  name;.  int code
1b90: 70 61 67 65 20 3d 20 41 72 65 46 69 6c 65 41 70  page = AreFileAp
1ba0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
1bb0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
1bc0: 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61   nByte = WideCha
1bd0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
1be0: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
1bf0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
1c00: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  0, 0, 0);.  zFil
1c10: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
1c20: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
1c30: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
1c40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c50: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
1c60: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
1c70: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
1c80: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
1c90: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
1ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
1cc0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
1cd0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72  e == 0 ){.    fr
1ce0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
1cf0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
1d00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
1d10: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1d20: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
1d30: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
1d40: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
1d50: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
1d60: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
1d70: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
1d80: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
1d90: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1da0: 2a 6d 62 63 73 54 6f 55 74 66 38 28 63 6f 6e 73  *mbcsToUtf8(cons
1db0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1dc0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
1dd0: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43 48  enameUtf8;.  WCH
1de0: 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  AR *zTmpWide;.. 
1df0: 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73   zTmpWide = mbcs
1e00: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
1e10: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
1e20: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
1e30: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
1e40: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75  FilenameUtf8 = u
1e50: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d  nicodeToUtf8(zTm
1e60: 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a  pWide);.  free(z
1e70: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
1e80: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
1e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
1ea0: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
1eb0: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
1ec0: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
1ed0: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
1ee0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
1ef0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1f00: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
1f10: 74 69 63 20 63 68 61 72 20 2a 75 74 66 38 54 6f  tic char *utf8To
1f20: 4d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  Mbcs(const char 
1f30: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
1f40: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
1f50: 63 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d  cs;.  WCHAR *zTm
1f60: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
1f70: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
1f80: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
1f90: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
1fa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1fb0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
1fc0: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54  eMbcs = unicodeT
1fd0: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
1fe0: 0a 20 20 66 72 65 65 28 7a 54 6d 70 57 69 64 65  .  free(zTmpWide
1ff0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
2000: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 23 69  enameMbcs;.}..#i
2010: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2020: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
2030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2070: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
2080: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
2090: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a  inCE only..*/./*
20a0: 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f  .** WindowsCE do
20b0: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  es not have a lo
20c0: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
20d0: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61  on.  So create a
20e0: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a  .** substitute..
20f0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
2100: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
2110: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
2120: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
2130: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
2140: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
2150: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
2160: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
2170: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
2180: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
2190: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
21a0: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
21b0: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
21c0: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 74  wLowDateTime = t
21d0: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 3b  64 & 0xFFFFFFFF;
21e0: 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74  .  uTm.dwHighDat
21f0: 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33 32  eTime= t64 >> 32
2200: 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f  ;.  FileTimeToLo
2210: 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d  calFileTime(&uTm
2220: 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69  ,&lTm);.  FileTi
2230: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
2240: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
2250: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
2260: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
2270: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
2280: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
2290: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
22a0: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
22b0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
22c0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
22d0: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
22e0: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
22f0: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
2300: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
2310: 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn &y;.}../* Th
2320: 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  is will never be
2330: 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66   called, but def
2340: 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  ined to make the
2350: 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f   code compile */
2360: 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70  .#define GetTemp
2370: 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66  PathA(a,b)..#def
2380: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62  ine LockFile(a,b
2390: 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69  ,c,d,e)       wi
23a0: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  nceLockFile(&a, 
23b0: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66  b, c, d, e).#def
23c0: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61  ine UnlockFile(a
23d0: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69  ,b,c,d,e)     wi
23e0: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61  nceUnlockFile(&a
23f0: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64  , b, c, d, e).#d
2400: 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78  efine LockFileEx
2410: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20  (a,b,c,d,e,f)   
2420: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28  winceLockFileEx(
2430: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20  &a, b, c, d, e, 
2440: 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44  f)..#define HAND
2450: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29  LE_TO_WINFILE(a)
2460: 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68   (winFile*)&((ch
2470: 61 72 2a 29 61 29 5b 2d 6f 66 66 73 65 74 6f 66  ar*)a)[-offsetof
2480: 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a  (winFile,h)]../*
2490: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f  .** Acquire a lo
24a0: 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65  ck on the handle
24b0: 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   h.*/.static voi
24c0: 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  d winceMutexAcqu
24d0: 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20  ire(HANDLE h){. 
24e0: 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20    DWORD dwErr;. 
24f0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72    do {.     dwEr
2500: 72 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c  r = WaitForSingl
2510: 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e  eObject(h, INFIN
2520: 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65  ITE);.   } while
2530: 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f   (dwErr != WAIT_
2540: 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72  OBJECT_0 && dwEr
2550: 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f  r != WAIT_ABANDO
2560: 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  NED);.}./*.** Re
2570: 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71  lease a lock acq
2580: 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75  uired by winceMu
2590: 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a  texAcquire().*/.
25a0: 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74  #define winceMut
25b0: 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c  exRelease(h) Rel
25c0: 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a  easeMutex(h)../*
25d0: 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d  .** Create the m
25e0: 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20  utex and shared 
25f0: 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20  memory used for 
2600: 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66  locking in the f
2610: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
2620: 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  r pFile.*/.stati
2630: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61  c BOOL winceCrea
2640: 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61  teLock(const cha
2650: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69  r *zFilename, wi
2660: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
2670: 20 57 43 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20   WCHAR *zTok;.  
2680: 57 43 48 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75  WCHAR *zName = u
2690: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
26a0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20  lename);.  BOOL 
26b0: 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
26c0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
26d0: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74  he local lockdat
26e0: 61 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72  a */.  ZeroMemor
26f0: 79 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  y(&pFile->local,
2700: 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c   sizeof(pFile->l
2710: 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  ocal));..  /* Re
2720: 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c  place the backsl
2730: 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66  ashes from the f
2740: 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65  ilename and lowe
2750: 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f  rcase it.  ** to
2760: 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78 20   derive a mutex 
2770: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20  name. */.  zTok 
2780: 3d 20 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61  = CharLowerW(zNa
2790: 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54  me);.  for (;*zT
27a0: 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20  ok;zTok++){.    
27b0: 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c  if (*zTok == '\\
27c0: 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a  ') *zTok = '_';.
27d0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
27e0: 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20  /open the named 
27f0: 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65  mutex */.  pFile
2800: 2d 3e 68 4d 75 74 65 78 20 3d 20 43 72 65 61 74  ->hMutex = Creat
2810: 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
2820: 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
2830: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
2840: 78 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61  x){.    free(zNa
2850: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2860: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FALSE;.  }..  /*
2870: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
2880: 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  ex before contin
2890: 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d  uing */.  winceM
28a0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
28b0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20  e->hMutex);.  . 
28c0: 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61   /* Since the na
28d0: 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74  mes of named mut
28e0: 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73  exes, semaphores
28f0: 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20  , file mappings 
2900: 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61  etc are .  ** ca
2910: 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61  se-sensitive, ta
2920: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
2930: 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73  that by uppercas
2940: 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61  ing the mutex na
2950: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e  me.  ** and usin
2960: 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68  g that as the sh
2970: 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67  ared filemapping
2980: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68   name..  */.  Ch
2990: 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b  arUpperW(zName);
29a0: 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  .  pFile->hShare
29b0: 64 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61  d = CreateFileMa
29c0: 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48  ppingW(INVALID_H
29d0: 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c  ANDLE_VALUE, NUL
29e0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52            PAGE_R
2a10: 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a  EADWRITE, 0, siz
2a20: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a  eof(winceLock),.
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20         zName);  
2a60: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
2a70: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
2a80: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
2a90: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
2aa0: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a  emory so it .  *
2ab0: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
2ac0: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
2ad0: 69 66 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72  if (GetLastError
2ae0: 28 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  () == ERROR_ALRE
2af0: 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
2b00: 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
2b10: 20 20 7d 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d    }..  free(zNam
2b20: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
2b30: 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
2b40: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
2b50: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
2b60: 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70  p it. */.  if (p
2b70: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a  File->hShared){.
2b80: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
2b90: 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29  d = (winceLock*)
2ba0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
2bb0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20  ile->hShared, . 
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45              FILE
2bd0: 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d  _MAP_READ|FILE_M
2be0: 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20  AP_WRITE, 0, 0, 
2bf0: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
2c00: 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61  ));.    /* If ma
2c10: 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c  pping failed, cl
2c20: 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d  ose the shared m
2c30: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64  emory handle and
2c40: 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20   erase it */.   
2c50: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61   if (!pFile->sha
2c60: 72 65 64 29 7b 0a 20 20 20 20 20 20 43 6c 6f 73  red){.      Clos
2c70: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
2c80: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
2c90: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
2ca0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NULL;.    }.  }.
2cb0: 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20  .  /* If shared 
2cc0: 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74  memory could not
2cd0: 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68 65   be created, the
2ce0: 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  n close the mute
2cf0: 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20  x and fail */.  
2d00: 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  if (pFile->hShar
2d10: 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20  ed == NULL){.   
2d20: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
2d30: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
2d40: 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  );.    CloseHand
2d50: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
2d60: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
2d70: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
2d80: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20   return FALSE;. 
2d90: 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69   }.  .  /* Initi
2da0: 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64  alize the shared
2db0: 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65   memory if we're
2dc0: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a   supposed to */.
2dd0: 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20    if (bInit) {. 
2de0: 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46     ZeroMemory(pF
2df0: 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a  ile->shared, siz
2e00: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
2e10: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
2e20: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
2e30: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
2e40: 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn TRUE;.}../*.*
2e50: 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70 61  * Destroy the pa
2e60: 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68  rt of winFile th
2e70: 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77 69  at deals with wi
2e80: 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61  nce locks.*/.sta
2e90: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65  tic void winceDe
2ea0: 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c  stroyLock(winFil
2eb0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20  e *pFile){.  if 
2ec0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  (pFile->hMutex){
2ed0: 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20  .    /* Acquire 
2ee0: 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20  the mutex */.   
2ef0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
2f00: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
2f10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  );..    /* The f
2f20: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20  ollowing blocks 
2f30: 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  should probably 
2f40: 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67 20  assert in debug 
2f50: 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20  mode, but they. 
2f60: 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65        are to cle
2f70: 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79  anup in case any
2f80: 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20   locks remained 
2f90: 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28  open */.    if (
2fa0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
2fb0: 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46  aders){.      pF
2fc0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
2fd0: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a  aders --;.    }.
2fe0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
2ff0: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b  ocal.bReserved){
3000: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
3010: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
3020: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
3030: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
3040: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
3050: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3060: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
3070: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
3080: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3090: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
30a0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
30b0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
30c0: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  FALSE;.    }..  
30d0: 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63    /* De-referenc
30e0: 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20  e and close our 
30f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61 72  copy of the shar
3100: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
3110: 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56 69 65   */.    UnmapVie
3120: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
3130: 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73  hared);.    Clos
3140: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
3150: 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
3160: 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
3170: 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
3180: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
3190: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20  ile->hMutex);   
31a0: 20 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c   .    CloseHandl
31b0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
31c0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
31d0: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  tex = NULL;.  }.
31e0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70  }../* .** An imp
31f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
3200: 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50  he LockFile() AP
3210: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
3220: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
3230: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
3240: 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70  ile(.  HANDLE *p
3250: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
3260: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
3270: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
3280: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
3290: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
32a0: 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  ToLockLow,.  DWO
32b0: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
32c0: 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  sToLockHigh.){. 
32d0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
32e0: 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
32f0: 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
3300: 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
3310: 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  LSE;..  if (!pFi
3320: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
3330: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
3340: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
3350: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
3360: 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
3370: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
3380: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
3390: 73 65 74 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44  setLow == SHARED
33a0: 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26  _FIRST.       &&
33b0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
33c0: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 53 48 41 52  oLockLow == SHAR
33d0: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
33e0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
33f0: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
3400: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
3410: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
3420: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
3430: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
3440: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
3450: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
3460: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
3470: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
3480: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3490: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
34a0: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
34b0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 28   */.  else if ((
34c0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
34d0: 3e 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 20  >= SHARED_FIRST 
34e0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  &&.            d
34f0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3c  wFileOffsetLow <
3500: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
3510: 53 48 41 52 45 44 5f 53 49 5a 45 29 20 26 26 0a  SHARED_SIZE) &&.
3520: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d              nNum
3530: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
3540: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
3550: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
3560: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
3570: 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
3580: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
3590: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
35a0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
35b0: 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
35c0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
35d0: 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
35e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
35f0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
3600: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
3610: 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
3620: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
3630: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
3640: 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  == PENDING_BYTE 
3650: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
3660: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
3670: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70  {.    /* If no p
3680: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
3690: 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74  been acquired, t
36a0: 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a  hen acquire it *
36b0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
36c0: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
36d0: 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  g == 0) {.      
36e0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
36f0: 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
3700: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
3710: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  al.bPending = TR
3720: 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
3730: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3740: 20 20 7d 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20    }.  /* Want a 
3750: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
3760: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3770: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3780: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
3790: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
37a0: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
37b0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
37c0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
37d0: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
37e0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
37f0: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
3800: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
3810: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54  al.bReserved = T
3820: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
3830: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
3840: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
3850: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
3860: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
3870: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
3880: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
3890: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e  tation of the Un
38a0: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20  lockFile API of 
38b0: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
38c0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
38d0: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
38e0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
38f0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
3900: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
3910: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
3920: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
3930: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
3940: 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
3950: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
3960: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
3970: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
3980: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
3990: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
39a0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
39b0: 41 4c 53 45 3b 0a 0a 20 20 69 66 20 28 21 70 46  ALSE;..  if (!pF
39c0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
39d0: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
39e0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
39f0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
3a00: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
3a10: 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
3a20: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
3a30: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
3a40: 4f 66 66 73 65 74 4c 6f 77 20 3e 3d 20 53 48 41  OffsetLow >= SHA
3a50: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
3a60: 20 20 20 20 64 77 46 69 6c 65 4f 66 66 73 65 74      dwFileOffset
3a70: 4c 6f 77 20 3c 20 53 48 41 52 45 44 5f 46 49 52  Low < SHARED_FIR
3a80: 53 54 20 2b 20 53 48 41 52 45 44 5f 53 49 5a 45  ST + SHARED_SIZE
3a90: 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
3aa0: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
3ab0: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
3ac0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3ad0: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
3ae0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
3af0: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
3b00: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
3b10: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3b20: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
3b30: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
3b40: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
3b50: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
3b60: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
3b70: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
3b80: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
3b90: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
3ba0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
3bb0: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
3bc0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
3bd0: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a  .nReaders == 0).
3be0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
3bf0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
3c00: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
3c10: 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
3c20: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3c30: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73    }..  /* Releas
3c40: 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ing a pending lo
3c50: 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
3c60: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
3c70: 20 3d 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   == PENDING_BYTE
3c80: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
3c90: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
3ca0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
3cb0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
3cc0: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
3cd0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
3ce0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
3cf0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3d00: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
3d10: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
3d20: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
3d30: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
3d40: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
3d50: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
3d60: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
3d70: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26   RESERVED_BYTE &
3d80: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3d90: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
3da0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
3db0: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
3dc0: 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d) {.      pFile
3dd0: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
3de0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
3df0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3e00: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
3e10: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3e20: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3e30: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
3e40: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
3e50: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
3e60: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
3e70: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
3e80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
3e90: 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20  FileEx() API of 
3ea0: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
3eb0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
3ec0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78   winceLockFileEx
3ed0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
3ee0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  le,.  DWORD dwFl
3ef0: 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52  ags,.  DWORD dwR
3f00: 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44  eserved,.  DWORD
3f10: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
3f20: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
3f30: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
3f40: 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50  ToLockHigh,.  LP
3f50: 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65  OVERLAPPED lpOve
3f60: 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 2f 2a 20  rlapped.){.  /* 
3f70: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61  If the caller wa
3f80: 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61  nts a shared rea
3f90: 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20  d lock, forward 
3fa0: 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74  this call.  ** t
3fb0: 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20  o winceLockFile 
3fc0: 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c  */.  if (lpOverl
3fd0: 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d  apped->Offset ==
3fe0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26   SHARED_FIRST &&
3ff0: 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73 20 3d  .      dwFlags =
4000: 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e 4e 75  = 1 &&.      nNu
4010: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
4020: 6b 4c 6f 77 20 3d 3d 20 53 48 41 52 45 44 5f 53  kLow == SHARED_S
4030: 49 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IZE){.    return
4040: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70   winceLockFile(p
4050: 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  hFile, SHARED_FI
4060: 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  RST, 0, 1, 0);. 
4070: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53   }.  return FALS
4080: 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  E;.}./*.** End o
4090: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f  f the special co
40a0: 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a  de for wince.***
40b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
4100: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
4110: 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  WINCE */../*****
4120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 20 54 68 65 20  ********.** The 
4170: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f  next group of ro
4180: 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
4190: 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
41a0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
41b0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
41c0: 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a  methods object..
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4220: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
4230: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
4240: 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
4250: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
4260: 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
4270: 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
4280: 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
4290: 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
42a0: 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 77 69  e result, but wi
42b0: 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
42c0: 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
42d0: 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
42e0: 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
42f0: 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
4300: 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
4310: 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
4320: 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
4330: 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
4340: 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
4350: 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
4360: 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
4370: 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
4380: 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
4390: 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
43a0: 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
43b0: 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
43c0: 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
43d0: 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
43e0: 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
43f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
4400: 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
4410: 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
4420: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
4430: 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 32 28  )id;.  OSTRACE2(
4440: 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46  "CLOSE %d\n", pF
4450: 69 6c 65 2d 3e 68 29 3b 0a 20 20 64 6f 7b 0a 20  ile->h);.  do{. 
4460: 20 20 20 72 63 20 3d 20 43 6c 6f 73 65 48 61 6e     rc = CloseHan
4470: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
4480: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
4490: 26 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f 43 4c 4f  & cnt++ < MX_CLO
44a0: 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 53  SE_ATTEMPT && (S
44b0: 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
44c0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
44d0: 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e  INCE.#define WIN
44e0: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
44f0: 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65  MPTS 3.  winceDe
4500: 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29  stroyLock(pFile)
4510: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a  ;.  if( pFile->z
4520: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b  DeleteOnClose ){
4530: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
4540: 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20  ;.    while(.   
4550: 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46 69          DeleteFi
4560: 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  leW(pFile->zDele
4570: 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20  teOnClose)==0.  
4580: 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c 65        && GetFile
4590: 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
45a0: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
45b0: 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a  e)!=0xffffffff .
45c0: 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b          && cnt++
45d0: 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f   < WINCE_DELETIO
45e0: 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29  N_ATTEMPTS.    )
45f0: 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28 31  {.       Sleep(1
4600: 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
4610: 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
4620: 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
4630: 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46 69    }.    free(pFi
4640: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
4650: 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  se);.  }.#endif.
4660: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
4670: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
4680: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
4690: 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a  ITE_IOERR;.}../*
46a0: 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f  .** Some microso
46b0: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
46c0: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
46d0: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
46e0: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
46f0: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
4700: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
4710: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
4720: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
4730: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
4740: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
4750: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
4760: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
4770: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
4780: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
4790: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
47a0: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
47b0: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
47c0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
47d0: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
47e0: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
47f0: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
4800: 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
4810: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
4820: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
4830: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
4840: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
4850: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
4860: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4870: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
4880: 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
4890: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
48a0: 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
48b0: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
48c0: 65 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47 20  et */.){.  LONG 
48d0: 75 70 70 65 72 42 69 74 73 20 3d 20 28 6f 66 66  upperBits = (off
48e0: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
48f0: 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20 6c 6f  fffff;.  LONG lo
4900: 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74  werBits = offset
4910: 20 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   & 0xffffffff;. 
4920: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44 57 4f   DWORD rc;.  DWO
4930: 52 44 20 67 6f 74 3b 0a 20 20 77 69 6e 46 69 6c  RD got;.  winFil
4940: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
4950: 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72  ile*)id;.  asser
4960: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
4970: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
4980: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
4990: 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41  R_READ);.  OSTRA
49a0: 43 45 33 28 22 52 45 41 44 20 25 64 20 6c 6f 63  CE3("READ %d loc
49b0: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
49c0: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
49d0: 70 65 29 3b 0a 20 20 72 63 20 3d 20 53 65 74 46  pe);.  rc = SetF
49e0: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
49f0: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
4a00: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
4a10: 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 72  _BEGIN);.  if( r
4a20: 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  c==INVALID_SET_F
4a30: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47  ILE_POINTER && G
4a40: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e  etLastError()!=N
4a50: 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72  O_ERROR ){.    r
4a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
4a70: 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65  L;.  }.  if( !Re
4a80: 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
4a90: 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74   pBuf, amt, &got
4aa0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
4ab0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
4ac0: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  READ;.  }.  if( 
4ad0: 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20  got==(DWORD)amt 
4ae0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4af0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
4b00: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  {.    memset(&((
4b10: 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
4b20: 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
4b30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4b40: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
4b50: 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
4b60: 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
4b70: 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
4b80: 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
4b90: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
4ba0: 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
4bb0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
4bc0: 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
4bd0: 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
4be0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
4bf0: 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
4c00: 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
4c10: 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
4c20: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
4c30: 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
4c40: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
4c50: 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c70: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
4c80: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
4c90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
4ca0: 73 65 74 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  set      /* Offs
4cb0: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
4cc0: 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
4cd0: 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e  g at */.){.  LON
4ce0: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 6f  G upperBits = (o
4cf0: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
4d00: 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e 47 20  fffffff;.  LONG 
4d10: 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 66 66 73  lowerBits = offs
4d20: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 3b  et & 0xffffffff;
4d30: 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44  .  DWORD rc;.  D
4d40: 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 77 69  WORD wrote;.  wi
4d50: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
4d60: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  winFile*)id;.  a
4d70: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
4d80: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
4d90: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
4da0: 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20  IOERR_WRITE);.  
4db0: 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
4dc0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
4dd0: 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54  ITE_FULL);.  OST
4de0: 52 41 43 45 33 28 22 57 52 49 54 45 20 25 64 20  RACE3("WRITE %d 
4df0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
4e00: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
4e10: 6b 74 79 70 65 29 3b 0a 20 20 72 63 20 3d 20 53  ktype);.  rc = S
4e20: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46  etFilePointer(pF
4e30: 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  ile->h, lowerBit
4e40: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
4e50: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66  ILE_BEGIN);.  if
4e60: 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  ( rc==INVALID_SE
4e70: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26  T_FILE_POINTER &
4e80: 26 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  & GetLastError()
4e90: 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  !=NO_ERROR ){.  
4ea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4eb0: 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  FULL;.  }.  asse
4ec0: 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 77  rt( amt>0 );.  w
4ed0: 68 69 6c 65 28 0a 20 20 20 20 20 61 6d 74 3e 30  hile(.     amt>0
4ee0: 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 57  .     && (rc = W
4ef0: 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
4f00: 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 77  h, pBuf, amt, &w
4f10: 72 6f 74 65 2c 20 30 29 29 21 3d 30 0a 20 20 20  rote, 0))!=0.   
4f20: 20 20 26 26 20 77 72 6f 74 65 3e 30 0a 20 20 29    && wrote>0.  )
4f30: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
4f40: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
4f50: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
4f60: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ote];.  }.  if( 
4f70: 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29  !rc || amt>(int)
4f80: 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74  wrote ){.    ret
4f90: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
4fa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
4fb0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
4fc0: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
4fd0: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
4fe0: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
4ff0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
5000: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
5010: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
5020: 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
5030: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20 3d  LONG upperBits =
5040: 20 28 6e 42 79 74 65 3e 3e 33 32 29 20 26 20 30   (nByte>>32) & 0
5050: 78 37 66 66 66 66 66 66 66 3b 0a 20 20 4c 4f 4e  x7fffffff;.  LON
5060: 47 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6e 42  G lowerBits = nB
5070: 79 74 65 20 26 20 30 78 66 66 66 66 66 66 66 66  yte & 0xffffffff
5080: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
5090: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
50a0: 64 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 22 54  d;.  OSTRACE3("T
50b0: 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c  RUNCATE %d %lld\
50c0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  n", pFile->h, nB
50d0: 79 74 65 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  yte);.  Simulate
50e0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
50f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
5100: 43 41 54 45 29 3b 0a 20 20 53 65 74 46 69 6c 65  CATE);.  SetFile
5110: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68  Pointer(pFile->h
5120: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
5130: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
5140: 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f 66  GIN);.  SetEndOf
5150: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  File(pFile->h);.
5160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5170: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
5180: 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
5190: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
51a0: 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
51b0: 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
51c0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
51d0: 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
51e0: 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
51f0: 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
5200: 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
5210: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
5220: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
5230: 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
5240: 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
5250: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
5260: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
5270: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
5280: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
5290: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
52a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
52b0: 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
52c0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
52d0: 67 73 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  gs){.  winFile *
52e0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
52f0: 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 33  *)id;.  OSTRACE3
5300: 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25  ("SYNC %d lock=%
5310: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
5320: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
5330: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
5340: 54 45 53 54 0a 20 20 69 66 28 20 66 6c 61 67 73  TEST.  if( flags
5350: 20 26 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   & SQLITE_SYNC_F
5360: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
5370: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
5380: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
5390: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
53a0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 46 6c  .#endif.  if( Fl
53b0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70  ushFileBuffers(p
53c0: 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20  File->h) ){.    
53d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
53e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
53f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5400: 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  RR;.  }.}../*.**
5410: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
5420: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
5430: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
5440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
5450: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
5460: 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
5470: 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  e3_int64 *pSize)
5480: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
5490: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
54a0: 64 3b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  d;.  DWORD upper
54b0: 42 69 74 73 2c 20 6c 6f 77 65 72 42 69 74 73 3b  Bits, lowerBits;
54c0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
54d0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
54e0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
54f0: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47 65 74   lowerBits = Get
5500: 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e  FileSize(pFile->
5510: 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a  h, &upperBits);.
5520: 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71    *pSize = (((sq
5530: 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65  lite3_int64)uppe
5540: 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f  rBits)<<32) + lo
5550: 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75 72  werBits;.  retur
5560: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5570: 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46  /*.** LOCKFILE_F
5580: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
5590: 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20  is undefined on 
55a0: 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73  some Windows sys
55b0: 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
55c0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
55d0: 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66  MMEDIATELY.# def
55e0: 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  ine LOCKFILE_FAI
55f0: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a  L_IMMEDIATELY 1.
5600: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
5610: 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
5620: 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
5630: 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
5640: 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
5650: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
5660: 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
5670: 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e   Win95 or WinNT.
5680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
5690: 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  etReadLock(winFi
56a0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
56b0: 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e  t res;.  if( isN
56c0: 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c  T() ){.    OVERL
56d0: 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20  APPED ovlp;.    
56e0: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48  ovlp.Offset = SH
56f0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
5700: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
5710: 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45  = 0;.    ovlp.hE
5720: 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65  vent = 0;.    re
5730: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70  s = LockFileEx(p
5740: 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c  File->h, LOCKFIL
5750: 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
5760: 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LY,.            
5770: 20 20 20 20 20 20 20 20 20 30 2c 20 53 48 41 52           0, SHAR
5780: 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76 6c  ED_SIZE, 0, &ovl
5790: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
57a0: 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
57b0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
57c0: 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
57d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
57e0: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 6c  redLockByte = (l
57f0: 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
5800: 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
5810: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63  );.    res = Loc
5820: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
5830: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69  SHARED_FIRST+pFi
5840: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
5850: 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
5860: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
5870: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
5880: 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
5890: 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61  ic int unlockRea
58a0: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
58b0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
58c0: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
58d0: 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f  {.    res = Unlo
58e0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
58f0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
5900: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
5910: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5920: 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65  res = UnlockFile
5930: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
5940: 44 5f 46 49 52 53 54 20 2b 20 70 46 69 6c 65 2d  D_FIRST + pFile-
5950: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
5960: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
5970: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
5980: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
5990: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
59a0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
59b0: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
59c0: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
59d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
59e0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
59f0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
5a00: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
5a10: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
5a20: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
5a30: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
5a40: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
5a50: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
5a60: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
5a70: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
5a80: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
5a90: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
5aa0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
5ab0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
5ac0: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
5ad0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
5ae0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
5af0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
5b00: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
5b10: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
5b20: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
5b30: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
5b40: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
5b50: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
5b60: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
5b70: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
5b80: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
5b90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
5ba0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
5bb0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
5bc0: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
5bd0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
5be0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
5bf0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
5c00: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
5c10: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
5c20: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
5c30: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
5c40: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
5c50: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
5c60: 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
5c70: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
5c80: 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
5c90: 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
5ca0: 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
5cb0: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
5cc0: 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
5cd0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
5ce0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
5cf0: 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
5d00: 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
5d10: 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
5d20: 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
5d30: 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
5d40: 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
5d50: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
5d60: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
5d70: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5d80: 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
5d90: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
5da0: 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
5db0: 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
5dc0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
5dd0: 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   windows lock ca
5de0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
5df0: 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
5e00: 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
5e10: 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
5e20: 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
5e30: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
5e40: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
5e50: 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
5e60: 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
5e70: 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
5e80: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
5e90: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
5ea0: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
5eb0: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52  ile!=0 );.  OSTR
5ec0: 41 43 45 35 28 22 4c 4f 43 4b 20 25 64 20 25 64  ACE5("LOCK %d %d
5ed0: 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a   was %d(%d)\n",.
5ee0: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
5ef0: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46  >h, locktype, pF
5f00: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
5f10: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
5f20: 42 79 74 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Byte);..  /* If 
5f30: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
5f40: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
5f50: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
5f60: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
5f70: 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
5f80: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
5f90: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
5fa0: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
5fb0: 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
5fc0: 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
5fd0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
5fe0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
5ff0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
6000: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65  cktype ){.    re
6010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6020: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
6030: 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
6040: 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
6050: 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
6060: 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
6070: 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
6080: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
6090: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
60a0: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
60b0: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
60c0: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
60d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
60e0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
60f0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
6100: 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
6110: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
6120: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
6130: 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  acquire a PENDIN
6140: 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61  G lock or.  ** a
6150: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49   SHARED lock.  I
6160: 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69  f we are acquiri
6170: 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
6180: 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f  , the acquisitio
6190: 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45  n of.  ** the PE
61a0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
61b0: 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20  is temporary..  
61c0: 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  */.  newLocktype
61d0: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
61e0: 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  pe;.  if( pFile-
61f0: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
6200: 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79  CK.   || (lockty
6210: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
6220: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK && pFile->loc
6230: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
6240: 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69  LOCK).  ){.    i
6250: 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20  nt cnt = 3;.    
6260: 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26  while( cnt-->0 &
6270: 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c  & (res = LockFil
6280: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
6290: 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
62a0: 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
62b0: 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74  /* Try 3 times t
62c0: 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e  o get the pendin
62d0: 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e  g lock.  The pen
62e0: 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20  ding lock might 
62f0: 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 6c 64  be.      ** held
6300: 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65 61 64   by another read
6310: 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f 20 77  er process who w
6320: 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74 20 6d  ill release it m
6330: 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20  omentarily..    
6340: 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41    */.      OSTRA
6350: 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67  CE2("could not g
6360: 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  et a PENDING loc
6370: 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e  k. cnt=%d\n", cn
6380: 74 29 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28  t);.      Sleep(
6390: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
63a0: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72  tPendingLock = r
63b0: 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  es;.  }..  /* Ac
63c0: 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
63d0: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
63e0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
63f0: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
6400: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
6410: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
6420: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
6430: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
6440: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
6450: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
6460: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
6470: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OCK;.    }.  }..
6480: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
6490: 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
64a0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
64b0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
64c0: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
64d0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
64e0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
64f0: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
6500: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
6510: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
6520: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
6530: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
6540: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
6550: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
6560: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
6570: 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
6580: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
6590: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
65a0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
65b0: 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
65c0: 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
65d0: 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
65e0: 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a  gLock = 0;.  }..
65f0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
6600: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20  EXCLUSIVE lock. 
6610: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
6620: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
6630: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
6640: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
6650: 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44  locktype>=SHARED
6660: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
6670: 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63   = unlockReadLoc
6680: 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53  k(pFile);.    OS
6690: 54 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c 6f  TRACE2("unreadlo
66a0: 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29  ck = %d\n", res)
66b0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b  ;.    res = Lock
66c0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
66d0: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
66e0: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
66f0: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
6700: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
6710: 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  e = EXCLUSIVE_LO
6720: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
6730: 20 20 20 20 20 4f 53 54 52 41 43 45 32 28 22 65       OSTRACE2("e
6740: 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e  rror-code = %d\n
6750: 22 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ", GetLastError(
6760: 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61  ));.      getRea
6770: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
6780: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
6790: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
67a0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
67b0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
67c0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
67d0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
67e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
67f0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
6800: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
6810: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  D_LOCK ){.    Un
6820: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
6830: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
6840: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
6850: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
6860: 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
6870: 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
6880: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
6890: 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
68a0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
68b0: 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
68c0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
68d0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
68e0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
68f0: 20 20 20 4f 53 54 52 41 43 45 34 28 22 4c 4f 43     OSTRACE4("LOC
6900: 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69  K FAILED %d tryi
6910: 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f  ng for %d but go
6920: 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t %d\n", pFile->
6930: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
6940: 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
6950: 79 70 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ype);.    rc = S
6960: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
6970: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
6980: 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  e = newLocktype;
6990: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
69a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
69b0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
69c0: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
69d0: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
69e0: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
69f0: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
6a00: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
6a10: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
6a20: 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
6a30: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f  n.** non-zero, o
6a40: 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a  therwise zero..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6a60: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
6a70: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
6a80: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
6a90: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77  ){.  int rc;.  w
6aa0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
6ab0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
6ac0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
6ad0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
6ae0: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
6af0: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
6b00: 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52  rc = 1;.    OSTR
6b10: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
6b20: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29  CK %d %d (local)
6b30: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
6b40: 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  c);.  }else{.   
6b50: 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70   rc = LockFile(p
6b60: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
6b70: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
6b80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
6b90: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65        UnlockFile
6ba0: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
6bb0: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
6bc0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
6bd0: 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52   = !rc;.    OSTR
6be0: 41 43 45 33 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE3("TEST WR-LO
6bf0: 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
6c00: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
6c10: 72 63 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  rc);.  }.  *pRes
6c20: 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  Out = rc;.  retu
6c30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6c40: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
6c50: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
6c60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
6c70: 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
6c80: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
6c90: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
6ca0: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
6cb0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
6cc0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
6cd0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
6ce0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
6cf0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
6d00: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
6d10: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
6d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6d30: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
6d40: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
6d50: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
6d60: 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
6d70: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6d80: 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
6d90: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
6da0: 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
6db0: 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
6dc0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
6dd0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
6de0: 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
6df0: 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
6e00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
6e10: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
6e20: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
6e30: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
6e40: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
6e50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6e60: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
6e70: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
6e80: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
6e90: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
6ea0: 54 52 41 43 45 35 28 22 55 4e 4c 4f 43 4b 20 25  TRACE5("UNLOCK %
6eb0: 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25  d to %d was %d(%
6ec0: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
6ed0: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
6ee0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
6ef0: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
6f00: 72 65 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 20 20  redLockByte);.  
6f10: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
6f20: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79  cktype;.  if( ty
6f30: 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe>=EXCLUSIVE_LO
6f40: 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b  CK ){.    Unlock
6f50: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53  File(pFile->h, S
6f60: 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
6f70: 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
6f80: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
6f90: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
6fa0: 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70  & !getReadLock(p
6fb0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
6fc0: 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
6fd0: 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
6fe0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
6ff0: 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
7000: 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
7010: 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
7020: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
7030: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
7040: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
7050: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
7060: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
7070: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
7080: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
7090: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
70a0: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
70b0: 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
70c0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e  D_LOCK ){.    un
70d0: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
70e0: 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  le);.  }.  if( t
70f0: 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype>=PENDING_LOC
7100: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7110: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
7120: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
7130: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  , 0);.  }.  pFil
7140: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f  e->locktype = lo
7150: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
7160: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
7170: 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
7180: 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
7190: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
71a0: 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
71b0: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
71c0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
71d0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
71e0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
71f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
7200: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
7210: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
7220: 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  g = ((winFile*)i
7230: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  d)->locktype;.  
7240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7250: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
7260: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7270: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
7280: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
7290: 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
72a0: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
72b0: 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
72c0: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
72d0: 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
72e0: 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
72f0: 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
7300: 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
7310: 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
7320: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
7330: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
7340: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
7350: 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
7360: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
7370: 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
7380: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
7390: 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
73a0: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
73b0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
73c0: 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
73d0: 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
73e0: 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
73f0: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
7400: 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
7410: 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
7420: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
7430: 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  *id){.  return S
7440: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
7450: 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a  CTOR_SIZE;.}../*
7460: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
7470: 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
7480: 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
7490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
74a0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
74b0: 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
74c0: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
74d0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
74e0: 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65  is vector define
74f0: 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64  s all the method
7500: 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61  s that can opera
7510: 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69  te on an.** sqli
7520: 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e  te3_file for win
7530: 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  32..*/.static co
7540: 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
7550: 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68  ethods winIoMeth
7560: 6f 64 20 3d 20 7b 0a 20 20 31 2c 20 20 20 20 20  od = {.  1,     
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
7590: 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20  /.  winClose,.  
75a0: 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57 72  winRead,.  winWr
75b0: 69 74 65 2c 0a 20 20 77 69 6e 54 72 75 6e 63 61  ite,.  winTrunca
75c0: 74 65 2c 0a 20 20 77 69 6e 53 79 6e 63 2c 0a 20  te,.  winSync,. 
75d0: 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20   winFileSize,.  
75e0: 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e  winLock,.  winUn
75f0: 6c 6f 63 6b 2c 0a 20 20 77 69 6e 43 68 65 63 6b  lock,.  winCheck
7600: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20  ReservedLock,.  
7610: 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a  winFileControl,.
7620: 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
7630: 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  .  winDeviceChar
7640: 61 63 74 65 72 69 73 74 69 63 73 0a 7d 3b 0a 0a  acteristics.};..
7650: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
76a0: 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 49 2f  Here ends the I/
76b0: 4f 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 66  O methods that f
76c0: 6f 72 6d 20 74 68 65 20 73 71 6c 69 74 65 33 5f  orm the sqlite3_
76d0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
76e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  t..**.** The nex
76f0: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
7700: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 56  implements the V
7710: 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a  FS methods..****
7720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
7770: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
7780: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
7790: 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
77a0: 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
77b0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
77c0: 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
77d0: 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
77e0: 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
77f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
7800: 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
7810: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
7820: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
7830: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
7840: 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74   void *convertUt
7850: 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
7860: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7870: 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  ){.  void *zConv
7880: 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
7890: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a   isNT() ){.    z
78a0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38  Converted = utf8
78b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
78c0: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
78d0: 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
78e0: 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65  utf8ToMbcs(zFile
78f0: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  name);.  }.  /* 
7900: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
7910: 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
7920: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
7930: 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
7940: 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
7950: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
7960: 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
7970: 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
7980: 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
7990: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
79a0: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
79b0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
79c0: 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
79d0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
79e0: 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
79f0: 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
7a00: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
7a10: 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
7a20: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
7a30: 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
7a40: 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20  3456789";.  int 
7a50: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65  i, j;.  char zTe
7a60: 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b  mpPath[MAX_PATH+
7a70: 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1];.  if( sqlite
7a80: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
7a90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7aa0: 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
7ab0: 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
7ac0: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74   "%s", sqlite3_t
7ad0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
7ae0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54    }else if( isNT
7af0: 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
7b00: 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41  zMulti;.    WCHA
7b10: 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f  R zWidePath[MAX_
7b20: 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65  PATH];.    GetTe
7b30: 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48  mpPathW(MAX_PATH
7b40: 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b  -30, zWidePath);
7b50: 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e  .    zMulti = un
7b60: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
7b70: 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
7b80: 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
7b90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7ba0: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
7bb0: 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
7bc0: 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 72  Multi);.      fr
7bd0: 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ee(zMulti);.    
7be0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
7bf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
7c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
7c10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
7c20: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73  ;.    char zMbcs
7c30: 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
7c40: 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 41      GetTempPathA
7c50: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
7c60: 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
7c70: 74 66 38 20 3d 20 6d 62 63 73 54 6f 55 74 66 38  tf8 = mbcsToUtf8
7c80: 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
7c90: 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
7ca0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7cb0: 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
7cc0: 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
7cd0: 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
7ce0: 20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20   free(zUtf8);.  
7cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7d00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
7d10: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
7d20: 66 6f 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65  for(i=strlen(zTe
7d30: 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20  mpPath); i>0 && 
7d40: 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d  zTempPath[i-1]==
7d50: 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  '\\'; i--){}.  z
7d60: 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b  TempPath[i] = 0;
7d70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
7d80: 6e 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75  ntf(nBuf-30, zBu
7d90: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f,.             
7da0: 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49        "%s\\"SQLI
7db0: 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
7dc0: 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b  FIX, zTempPath);
7dd0: 0a 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42  .  j = strlen(zB
7de0: 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
7df0: 61 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 26 7a  andomness(20, &z
7e00: 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
7e10: 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 2c 20 6a  =0; i<20; i++, j
7e20: 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
7e30: 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
7e40: 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
7e50: 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
7e60: 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
7e70: 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
7e80: 30 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 22 54  0;.  OSTRACE2("T
7e90: 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73  EMP FILENAME: %s
7ea0: 5c 6e 22 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65  \n", zBuf);.  re
7eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
7ec0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  .}.../*.** Open 
7ed0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
7ee0: 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
7ef0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
7f00: 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  fs,        /* No
7f10: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
7f20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
7f30: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7f40: 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
7f50: 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
7f60: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
7f70: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
7f80: 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
7f90: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
7fa0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
7fb0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
7fc0: 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
7fd0: 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
7fe0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
7ff0: 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
8000: 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
8010: 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
8020: 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
8030: 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
8040: 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
8050: 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
8060: 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
8070: 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 20  ttributes = 0;. 
8080: 20 69 6e 74 20 69 73 54 65 6d 70 3b 0a 20 20 77   int isTemp;.  w
8090: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
80a0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
80b0: 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
80c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
80d0: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e    /* Filename in
80e0: 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a   OS encoding */.
80f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
8100: 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  tf8Name = zName;
8110: 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
8120: 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e  in UTF-8 encodin
8130: 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70  g */.  char zTmp
8140: 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  name[MAX_PATH+1]
8150: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  ;        /* Buff
8160: 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  er used to creat
8170: 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20  e temp filename 
8180: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  */..  /* If the 
8190: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
81a0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
81b0: 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61   is NULL, genera
81c0: 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  te a .  ** tempo
81d0: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
81e0: 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66  o use .  */.  if
81f0: 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a  ( !zUtf8Name ){.
8200: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 67 65 74      int rc = get
8210: 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
8220: 48 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  H+1, zTmpname);.
8230: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
8240: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
8250: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
8260: 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20      zUtf8Name = 
8270: 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
8280: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
8290: 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20  filename to the 
82a0: 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e  system encoding.
82b0: 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64   */.  zConverted
82c0: 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
82d0: 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65  lename(zUtf8Name
82e0: 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
82f0: 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
8300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8310: 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c  M;.  }..  if( fl
8320: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
8330: 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20  N_READWRITE ){. 
8340: 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
8350: 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
8360: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
8370: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
8380: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
8390: 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
83a0: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
83b0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
83c0: 45 41 54 45 20 29 7b 0a 20 20 20 20 64 77 43 72  EATE ){.    dwCr
83d0: 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
83e0: 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
83f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
8400: 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
8410: 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54  ion = OPEN_EXIST
8420: 49 4e 47 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  ING;.  }.  if( f
8430: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
8440: 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
8450: 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
8460: 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
8470: 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
8480: 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
8490: 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 30   dwShareMode = 0
84a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
84b0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
84c0: 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
84d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
84e0: 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73  INCE.    dwFlags
84f0: 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
8500: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
8510: 49 44 44 45 4e 3b 0a 23 65 6c 73 65 0a 20 20 20  IDDEN;.#else.   
8520: 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
8530: 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
8540: 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59  RIBUTE_TEMPORARY
8550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  | FILE_ATTRIBUTE
8580: 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20  _HIDDEN.        
8590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85a0: 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c         | FILE_FL
85b0: 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f  AG_DELETE_ON_CLO
85c0: 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  SE;.#endif.    i
85d0: 73 54 65 6d 70 20 3d 20 31 3b 0a 20 20 7d 65 6c  sTemp = 1;.  }el
85e0: 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41  se{.    dwFlagsA
85f0: 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
8600: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
8610: 52 4d 41 4c 3b 0a 20 20 20 20 69 73 54 65 6d 70  RMAL;.    isTemp
8620: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52   = 0;.  }.  /* R
8630: 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20  eports from the 
8640: 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61  internet are tha
8650: 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73  t performance is
8660: 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74   always.  ** bet
8670: 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47  ter if FILE_FLAG
8680: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69  _RANDOM_ACCESS i
8690: 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20  s used.  Ticket 
86a0: 23 32 36 39 39 2e 20 2a 2f 0a 20 20 64 77 46 6c  #2699. */.  dwFl
86b0: 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
86c0: 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
86d0: 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 69  NDOM_ACCESS;.  i
86e0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
86f0: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57   h = CreateFileW
8700: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
8710: 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65  ted,.       dwDe
8720: 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
8730: 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
8740: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
8750: 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
8760: 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
8770: 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
8780: 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
8790: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 7d 65  NULL.    );.  }e
87a0: 6c 73 65 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  lse{.#if SQLITE_
87b0: 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74  OS_WINCE.    ret
87c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
87d0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20  ;.#else.    h = 
87e0: 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61  CreateFileA((cha
87f0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  r*)zConverted,. 
8800: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
8810: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
8820: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
8830: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
8840: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
8850: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
8860: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
8870: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
8880: 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d     );.#endif.  }
8890: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
88a0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
88b0: 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  {.    free(zConv
88c0: 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20  erted);.    if( 
88d0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
88e0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b  PEN_READWRITE ){
88f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
8900: 6e 4f 70 65 6e 28 30 2c 20 7a 4e 61 6d 65 2c 20  nOpen(0, zName, 
8910: 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  id, .           
8920: 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
8930: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26  _OPEN_READONLY)&
8940: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  ~SQLITE_OPEN_REA
8950: 44 57 52 49 54 45 29 2c 20 70 4f 75 74 46 6c 61  DWRITE), pOutFla
8960: 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gs);.    }else{.
8970: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8980: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
8990: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f    }.  }.  if( pO
89a0: 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
89b0: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
89c0: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
89d0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
89e0: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
89f0: 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
8a00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
8a10: 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
8a20: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
8a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65  ;.    }.  }.  me
8a40: 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
8a50: 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a  izeof(*pFile));.
8a60: 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
8a70: 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
8a80: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
8a90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8aa0: 49 4e 43 45 0a 20 20 69 66 28 20 28 66 6c 61 67  INCE.  if( (flag
8ab0: 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s & (SQLITE_OPEN
8ac0: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
8ad0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 29  E_OPEN_MAIN_DB))
8ae0: 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20   ==.            
8af0: 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
8b00: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
8b10: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20  _OPEN_MAIN_DB). 
8b20: 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65 43        && !winceC
8b30: 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
8b40: 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20   pFile).  ){.   
8b50: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b   CloseHandle(h);
8b60: 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65  .    free(zConve
8b70: 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72  rted);.    retur
8b80: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
8b90: 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  N;.  }.  if( isT
8ba0: 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
8bb0: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
8bc0: 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
8bd0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
8be0: 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  {.    free(zConv
8bf0: 65 72 74 65 64 29 3b 0a 20 20 7d 0a 20 20 4f 70  erted);.  }.  Op
8c00: 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
8c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8c20: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  K;.}../*.** Dele
8c30: 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
8c40: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
8c50: 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20  at windows does 
8c60: 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65  not allow a file
8c70: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
8c80: 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  f some other.** 
8c90: 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f  process has it o
8ca0: 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  pen.  Sometimes 
8cb0: 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20  a virus scanner 
8cc0: 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67  or indexing prog
8cd0: 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e  ram.** will open
8ce0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
8cf0: 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74  shortly after it
8d00: 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f   is created in o
8d10: 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68  rder to do.** wh
8d20: 61 74 65 76 65 72 20 64 6f 65 73 2e 20 20 57 68  atever does.  Wh
8d30: 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70  ile this other p
8d40: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
8d50: 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70  g the.** file op
8d60: 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75  en, we will be u
8d70: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  nable to delete 
8d80: 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  it.  To work aro
8d90: 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62  und this.** prob
8da0: 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30  lem, we delay 10
8db0: 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
8dc0: 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65  nd try to delete
8dd0: 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74   again.  Up.** t
8de0: 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  o MX_DELETION_AT
8df0: 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20  TEMPTs deletion 
8e00: 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e  attempts are run
8e10: 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a   before giving.*
8e20: 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  * up and returni
8e30: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
8e40: 23 64 65 66 69 6e 65 20 4d 58 5f 44 45 4c 45 54  #define MX_DELET
8e50: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 35 0a 73  ION_ATTEMPTS 5.s
8e60: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
8e70: 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
8e80: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
8e90: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
8ea0: 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
8eb0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
8ec0: 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
8ed0: 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
8ee0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  te */.  int sync
8ef0: 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Dir             
8f00: 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
8f10: 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20  on win32 */.){. 
8f20: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
8f30: 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a  int rc;.  void *
8f40: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
8f50: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
8f60: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
8f70: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
8f80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8f90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
8fa0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
8fb0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
8fc0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
8fd0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
8fe0: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65      do{.      De
8ff0: 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65  leteFileW(zConve
9000: 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c  rted);.    }whil
9010: 65 28 20 28 72 63 20 3d 20 47 65 74 46 69 6c 65  e( (rc = GetFile
9020: 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
9030: 76 65 72 74 65 64 29 29 21 3d 30 78 66 66 66 66  verted))!=0xffff
9040: 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 20 20  ffff .          
9050: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 4d 58 5f    && cnt++ < MX_
9060: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
9070: 53 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29  S && (Sleep(100)
9080: 2c 20 31 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  , 1) );.  }else{
9090: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
90a0: 49 4e 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20  INCE.    return 
90b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65  SQLITE_NOMEM;.#e
90c0: 6c 73 65 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  lse.    do{.    
90d0: 20 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43    DeleteFileA(zC
90e0: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d  onverted);.    }
90f0: 77 68 69 6c 65 28 20 28 72 63 20 3d 20 47 65 74  while( (rc = Get
9100: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
9110: 7a 43 6f 6e 76 65 72 74 65 64 29 29 21 3d 30 78  zConverted))!=0x
9120: 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20  ffffffff.       
9130: 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20       && cnt++ < 
9140: 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
9150: 4d 50 54 53 20 26 26 20 28 53 6c 65 65 70 28 31  MPTS && (Sleep(1
9160: 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69  00), 1) );.#endi
9170: 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f  f.  }.  free(zCo
9180: 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
9190: 41 43 45 32 28 22 44 45 4c 45 54 45 20 5c 22 25  ACE2("DELETE \"%
91a0: 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  s\"\n", zFilenam
91b0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3d  e);.  return rc=
91c0: 3d 30 78 66 66 66 66 66 66 66 66 20 3f 20 53 51  =0xffffffff ? SQ
91d0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
91e0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d  _IOERR_DELETE;.}
91f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
9200: 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20  e existance and 
9210: 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65  status of a file
9220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9230: 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c  winAccess(.  sql
9240: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
9250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
9260: 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
9270: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
9280: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
9290: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
92a0: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
92b0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
92c0: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
92d0: 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e   test to make on
92e0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
92f0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
9300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9310: 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a  T: Result */.){.
9320: 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
9330: 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a  int rc;.  void *
9340: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
9350: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
9360: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
9370: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
9380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9390: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
93a0: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
93b0: 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46  .    attr = GetF
93c0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 28  ileAttributesW((
93d0: 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
93e0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  d);.  }else{.#if
93f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
9400: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9410: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
9420: 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69      attr = GetFi
9430: 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
9440: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
9450: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66  ;.#endif.  }.  f
9460: 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
9470: 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
9480: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
9490: 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
94a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
94b0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
94c0: 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
94d0: 3d 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 20  =0xffffffff;.   
94e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
94f0: 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
9500: 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
9510: 20 20 72 63 20 3d 20 28 61 74 74 72 20 26 20 46    rc = (attr & F
9520: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
9530: 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
9540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9550: 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
9560: 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
9570: 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
9580: 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
9590: 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rc;.  return SQL
95a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
95b0: 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
95c0: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
95d0: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
95e0: 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
95f0: 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
9600: 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
9610: 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
9620: 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
9630: 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
9640: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
9650: 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
9660: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
9670: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
9680: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9690: 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
96a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
96b0: 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
96c0: 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
96d0: 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
96e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
9710: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
9720: 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
9730: 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
9740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
9750: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
9760: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
9770: 59 47 57 49 4e 5f 5f 29 0a 20 20 63 79 67 77 69  YGWIN__).  cygwi
9780: 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77  n_conv_to_full_w
9790: 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74  in32_path(zRelat
97a0: 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72  ive, zFull);.  r
97b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
97c0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
97d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
97e0: 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
97f0: 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
9800: 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
9810: 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
9820: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  */.  sqlite3_snp
9830: 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
9840: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
9850: 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
9860: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9870: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
9880: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
9890: 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
98a0: 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
98b0: 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
98c0: 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
98d0: 72 20 2a 7a 4f 75 74 3b 0a 20 20 7a 43 6f 6e 76  r *zOut;.  zConv
98e0: 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
98f0: 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c  tf8Filename(zRel
9900: 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73  ative);.  if( is
9910: 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41  NT() ){.    WCHA
9920: 52 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  R *zTemp;.    nB
9930: 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74  yte = GetFullPat
9940: 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a  hNameW((WCHAR*)z
9950: 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
9960: 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65   0) + 3;.    zTe
9970: 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  mp = malloc( nBy
9980: 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
9990: 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
99a0: 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
99b0: 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
99c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
99d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
99e0: 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50    }.    GetFullP
99f0: 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a  athNameW((WCHAR*
9a00: 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
9a10: 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
9a20: 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
9a30: 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
9a40: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
9a50: 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  emp);.    free(z
9a60: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
9a70: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b      char *zTemp;
9a80: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74  .    nByte = Get
9a90: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
9aa0: 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
9ab0: 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
9ac0: 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f     zTemp = mallo
9ad0: 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
9ae0: 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
9af0: 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
9b00: 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  .      free(zCon
9b10: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
9b20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
9b30: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65  EM;.    }.    Ge
9b40: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
9b50: 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
9b60: 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
9b70: 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f  0);.    free(zCo
9b80: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
9b90: 75 74 20 3d 20 6d 62 63 73 54 6f 55 74 66 38 28  ut = mbcsToUtf8(
9ba0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65  zTemp);.    free
9bb0: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  (zTemp);.  }.  i
9bc0: 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73  f( zOut ){.    s
9bd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9be0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
9bf0: 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
9c00: 4f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  Out);.    free(z
9c10: 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
9c20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
9c30: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
9c40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9c50: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
9c60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9c70: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
9c80: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
9c90: 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
9ca0: 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
9cb0: 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
9cc0: 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
9cd0: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
9ce0: 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
9cf0: 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
9d00: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .*/./*.** Interf
9d10: 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
9d20: 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
9d30: 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
9d40: 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
9d50: 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
9d60: 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
9d70: 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
9d80: 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
9d90: 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
9da0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
9db0: 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
9dc0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
9dd0: 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
9de0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
9df0: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
9e00: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
9e10: 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
9e20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9e30: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
9e40: 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61  ) ){.    h = Loa
9e50: 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41 52  dLibraryW((WCHAR
9e60: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
9e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20   }else{.    h = 
9e80: 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68  LoadLibraryA((ch
9e90: 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
9ea0: 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
9eb0: 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
9ec0: 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
9ed0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
9ee0: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
9ef0: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
9f00: 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
9f10: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
9f20: 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 72 72 6f  WINCE.  int erro
9f30: 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  r = GetLastError
9f40: 28 29 3b 0a 20 20 69 66 28 20 65 72 72 6f 72 3e  ();.  if( error>
9f50: 30 78 37 46 46 46 46 46 46 20 29 7b 0a 20 20 20  0x7FFFFFF ){.   
9f60: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
9f70: 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c  f(nBuf, zBufOut,
9f80: 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 22 2c   "OsError 0x%x",
9f90: 20 65 72 72 6f 72 29 3b 0a 20 20 7d 65 6c 73 65   error);.  }else
9fa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
9fb0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
9fc0: 66 4f 75 74 2c 20 22 4f 73 45 72 72 6f 72 20 25  fOut, "OsError %
9fd0: 64 22 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d 0a  d", error);.  }.
9fe0: 23 65 6c 73 65 0a 20 20 46 6f 72 6d 61 74 4d 65  #else.  FormatMe
9ff0: 73 73 61 67 65 41 28 0a 20 20 20 20 46 4f 52 4d  ssageA(.    FORM
a000: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
a010: 53 59 53 54 45 4d 2c 0a 20 20 20 20 4e 55 4c 4c  SYSTEM,.    NULL
a020: 2c 0a 20 20 20 20 47 65 74 4c 61 73 74 45 72 72  ,.    GetLastErr
a030: 6f 72 28 29 2c 0a 20 20 20 20 30 2c 0a 20 20 20  or(),.    0,.   
a040: 20 7a 42 75 66 4f 75 74 2c 0a 20 20 20 20 6e 42   zBufOut,.    nB
a050: 75 66 2d 31 2c 0a 20 20 20 20 30 0a 20 20 29 3b  uf-1,.    0.  );
a060: 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 2a  .#endif.}.void *
a070: 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
a080: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
a090: 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74   *pHandle, const
a0a0: 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 7b   char *zSymbol){
a0b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a0c0: 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65  INCE.  /* The Ge
a0d0: 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20  tProcAddressA() 
a0e0: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
a0f0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e  available on win
a100: 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ce. */.  return 
a110: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
a120: 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c  (HANDLE)pHandle,
a130: 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65   zSymbol);.#else
a140: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
a150: 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  windows platform
a160: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
a170: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
a180: 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73  e.  ** an Ansi s
a190: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
a1a0: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
a1b0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65   setting */.  re
a1c0: 74 75 72 6e 20 47 65 74 50 72 6f 63 41 64 64 72  turn GetProcAddr
a1d0: 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ess((HANDLE)pHan
a1e0: 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23  dle, zSymbol);.#
a1f0: 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e  endif.}.void win
a200: 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
a210: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
a220: 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 46 72 65  *pHandle){.  Fre
a230: 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
a240: 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  )pHandle);.}.#el
a250: 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
a260: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
a270: 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
a280: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
a290: 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
a2a0: 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
a2b0: 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
a2c0: 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
a2d0: 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
a2e0: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  endif.../*.** Wr
a2f0: 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62  ite up to nBuf b
a300: 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65  ytes of randomne
a310: 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f  ss into zBuf..*/
a320: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
a330: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
a340: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
a350: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
a360: 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  f){.  int n = 0;
a370: 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59  .  if( sizeof(SY
a380: 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d  STEMTIME)<=nBuf-
a390: 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54  n ){.    SYSTEMT
a3a0: 49 4d 45 20 78 3b 0a 20 20 20 20 47 65 74 53 79  IME x;.    GetSy
a3b0: 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
a3c0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
a3d0: 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  ], &x, sizeof(x)
a3e0: 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
a3f0: 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  of(x);.  }.  if(
a400: 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
a410: 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
a420: 4f 52 44 20 70 69 64 20 3d 20 47 65 74 43 75 72  ORD pid = GetCur
a430: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b  rentProcessId();
a440: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
a450: 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  f[n], &pid, size
a460: 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20  of(pid));.    n 
a470: 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a  += sizeof(pid);.
a480: 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
a490: 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
a4a0: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
a4b0: 20 3d 20 47 65 74 54 69 63 6b 43 6f 75 6e 74 28   = GetTickCount(
a4c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
a4d0: 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
a4e0: 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
a4f0: 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
a500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
a510: 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
a520: 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
a530: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
a540: 3b 0a 20 20 20 20 51 75 65 72 79 50 65 72 66 6f  ;.    QueryPerfo
a550: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
a560: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
a570: 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
a580: 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
a590: 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
a5a0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
a5b0: 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
a5c0: 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
a5d0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
a5e0: 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
a5f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a600: 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
a610: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
a620: 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65  microsec){.  Sle
a630: 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
a640: 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
a650: 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
a660: 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
a670: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a680: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
a690: 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
a6a0: 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d  ero value, becom
a6b0: 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  es the result.**
a6c0: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73   returned from s
a6d0: 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
a6e0: 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73 20  ime().  This is 
a6f0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
a700: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
a710: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
a720: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
a730: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
a740: 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
a750: 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
a760: 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
a770: 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
a780: 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
a790: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
a7a0: 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
a7b0: 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
a7c0: 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
a7d0: 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
a7e0: 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
a7f0: 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
a800: 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72  d..*/.int winCur
a810: 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
a820: 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
a830: 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 46 49  le *prNow){.  FI
a840: 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20  LETIME ft;.  /* 
a850: 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
a860: 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
a870: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
a880: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
a890: 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
a8a0: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
a8b0: 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
a8c0: 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
a8d0: 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64  13.5). .  */.  d
a8e0: 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66 20 53  ouble now;.#if S
a8f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
a900: 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65   SYSTEMTIME time
a910: 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d  ;.  GetSystemTim
a920: 65 28 26 74 69 6d 65 29 3b 0a 20 20 53 79 73 74  e(&time);.  Syst
a930: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
a940: 28 26 74 69 6d 65 2c 26 66 74 29 3b 0a 23 65 6c  (&time,&ft);.#el
a950: 73 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  se.  GetSystemTi
a960: 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66  meAsFileTime( &f
a970: 74 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 6e 6f  t );.#endif.  no
a980: 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74 2e  w = ((double)ft.
a990: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 20  dwHighDateTime) 
a9a0: 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b 20  * 4294967296.0; 
a9b0: 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77  .  *prNow = (now
a9c0: 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65 54   + ft.dwLowDateT
a9d0: 69 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30 30  ime)/86400000000
a9e0: 30 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35 3b  0.0 + 2305813.5;
a9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
aa00: 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
aa10: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
aa20: 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 73  {.    *prNow = s
aa30: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
aa40: 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20 32 34  ime/86400.0 + 24
aa50: 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23 65 6e  40587.5;.  }.#en
aa60: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  dif.  return 0;.
aa70: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  }..static int wi
aa80: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
aa90: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
aaa0: 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
aab0: 2a 7a 42 75 66 29 7b 0a 20 20 72 65 74 75 72 6e  *zBuf){.  return
aac0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69   0;.}../*.** Ini
aad0: 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e  tialize and dein
aae0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
aaf0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
ab00: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
ab10: 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
ab20: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
ab30: 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56  sqlite3_vfs winV
ab40: 66 73 20 3d 20 7b 0a 20 20 20 20 31 2c 20 20 20  fs = {.    1,   
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab60: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
ab70: 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
ab80: 2c 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20  ,   /* szOsFile 
ab90: 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c  */.    MAX_PATH,
aba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
abb0: 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
abc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
abd0: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
abe0: 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20    "win32",      
abf0: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
ac00: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
ac10: 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
ac20: 61 74 61 20 2a 2f 0a 20 0a 20 20 20 20 77 69 6e  ata */. .    win
ac30: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
ac40: 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
ac50: 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
ac60: 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
ac70: 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
ac80: 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
ac90: 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
aca0: 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 2f 2a 20  lPathname,   /* 
acb0: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
acc0: 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
acd0: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
ace0: 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
acf0: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  rror,        /* 
ad00: 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
ad10: 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
ad20: 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
ad30: 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
ad40: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
ad50: 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
ad60: 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 2f 2a 20  domness,     /* 
ad70: 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
ad80: 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
ad90: 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
ada0: 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
adb0: 74 54 69 6d 65 2c 20 20 20 20 2f 2a 20 78 43 75  tTime,    /* xCu
adc0: 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
add0: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
ade0: 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
adf0: 72 72 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 73  rror */.  };.  s
ae00: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
ae10: 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
ae20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ae30: 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69  _OK; .}.int sqli
ae40: 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
ae50: 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  { .  return SQLI
ae60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
ae70: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
ae80: 4e 20 2a 2f 0a                                   N */.