/ Hex Artifact Content
Login

Artifact 2f90f7bdec714fad51cd31b4ecad3cc1b4bb5aad:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f 6e 6c 79  for windows only
0210: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f   */.../*.** A No
0220: 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79 20  te About Memory 
0230: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  Allocation:.**.*
0240: 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75 73  * This driver us
0250: 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65  es malloc()/free
0260: 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74 68  () directly rath
0270: 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74 68  er than going th
0280: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51 4c  rough.** the SQL
0290: 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71 6c  ite-wrappers sql
02a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71  ite3_malloc()/sq
02b0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20 54  lite3_free().  T
02c0: 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a 2a  hose wrappers.**
02d0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66 6f   are designed fo
02e0: 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64 65  r use on embedde
02f0: 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  d systems where 
0300: 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63 65  memory is scarce
0310: 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66   and.** malloc f
0320: 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66  ailures happen f
0330: 72 65 71 75 65 6e 74 6c 79 2e 20 20 57 69 6e 33  requently.  Win3
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 64 65 73  n windows.** des
0710: 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74 20 73 6f  ktops but not so
0720: 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65   well in embedde
0730: 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23  d systems..*/..#
0740: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65  include <winbase
0750: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59  .h>..#ifdef __CY
0760: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0770: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0780: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0790: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74  cros used to det
07a0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
07b0: 72 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72  r not to use thr
07c0: 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  eads..*/.#if def
07d0: 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
07e0: 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23   && THREADSAFE.#
07f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0800: 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  32_THREADS 1.#en
0810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75  dif../*.** Inclu
0820: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0830: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0840: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0850: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0860: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  n.h"../*.** Some
0870: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
0880: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
0890: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
08a0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
08b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
08c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
08d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
08e0: 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64  (DWORD)-1) .#end
08f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  if../*.** Determ
0900: 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64 65  ine if we are de
0910: 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64 6f  aling with Windo
0920: 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61 73  wsCE - which has
0930: 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75 63   a much.** reduc
0940: 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  ed API..*/.#if S
0950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
0960: 20 64 65 66 69 6e 65 20 41 72 65 46 69 6c 65 41   define AreFileA
0970: 70 69 73 41 4e 53 49 28 29 20 31 0a 23 20 64 65  pisANSI() 1.# de
0980: 66 69 6e 65 20 46 6f 72 6d 61 74 4d 65 73 73 61  fine FormatMessa
0990: 67 65 57 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  geW(a,b,c,d,e,f,
09a0: 67 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  g) 0.#endif../* 
09b0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
09c0: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
09d0: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
09e0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
09f0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
0a00: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
0a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a20: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
0a30: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
0a40: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
0a50: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  memory */../*.**
0a60: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0a70: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0a80: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0a90: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0aa0: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0ab0: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
0ad0: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
0ae0: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
0af0: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
0b00: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
0b10: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
0b20: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
0b30: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
0b40: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0b50: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
0b80: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
0b90: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
0ba0: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
0bb0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0bc0: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
0bd0: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0be0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0bf0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0c00: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
0c10: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
0c20: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
0c30: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
0c40: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
0c50: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
0c60: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
0c70: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
0ca0: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
0cb0: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
0cc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0cd0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
0ce0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
0cf0: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
0d00: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
0d10: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
0d20: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
0d30: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
0d60: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
0d70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
0d80: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
0d90: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
0da0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0db0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0dc0: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0dd0: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0de0: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0df0: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0e00: 63 6b 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  ck */.  DWORD la
0e10: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
0e20: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
0e30: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
0e40: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
0e50: 20 20 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69    DWORD sectorSi
0e60: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ze;       /* Sec
0e70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
0e80: 64 65 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f  device file is o
0e90: 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  n */.  winShm *p
0ea0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
0eb0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
0ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
0ed0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
0ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0ef0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0f00: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0f10: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ile */.  int szC
0f20: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
0f30: 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63   /* Chunk size c
0f40: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
0f50: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
0f60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
0f70: 49 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44  INCE.  WCHAR *zD
0f80: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f  eleteOnClose;  /
0f90: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
0fa0: 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c  o delete when cl
0fb0: 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c  osing */.  HANDL
0fc0: 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20  E hMutex;       
0fd0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64     /* Mutex used
0fe0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
0ff0: 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63  ss to shared loc
1000: 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20  k */  .  HANDLE 
1010: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
1020: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
1030: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
1040: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
1050: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
1060: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
1070: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
1080: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
1090: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
10a0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
10b0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
10c0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
10d0: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
10e0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
10f0: 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74  * Forward protot
1100: 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ypes..*/.static 
1110: 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a  int getSectorSiz
1120: 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e(.    sqlite3_v
1130: 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f  fs *pVfs,.    co
1140: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
1150: 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38  ive     /* UTF-8
1160: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b   file name */.);
1170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1180: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
1190: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
11a0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
11b0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
11c0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
11d0: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
11e0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
11f0: 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57  is Win95.** or W
1200: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
1210: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
1220: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
1230: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1240: 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a  tem is Win95..**
1250: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
1260: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
1270: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
1280: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
1290: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
12a0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
12b0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
12c0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
12d0: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
12e0: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
12f0: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64  ehavior..*/.#ifd
1300: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1310: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1320: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  pe = 0;.#else.st
1330: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1340: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1350: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1360: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
1370: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
1380: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
1390: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
13a0: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
13b0: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
13c0: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
13d0: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
13e0: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
13f0: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
1400: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
1410: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
1420: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
1430: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
1440: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
1450: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
1460: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
1470: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
1480: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
1490: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69   when running Wi
14a0: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
14b0: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
14c0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
14d0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
14e0: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
14f0: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
1500: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
1510: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
1520: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
1530: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
1540: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
1550: 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  () API..*/.#if S
1560: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
1570: 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20   define isNT()  
1580: 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74  (1).#else.  stat
1590: 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64  ic int isNT(void
15a0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
15b0: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b  e3_os_type==0 ){
15c0: 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  .      OSVERSION
15d0: 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20  INFO sInfo;.    
15e0: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
15f0: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
1600: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
1610: 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45 78 28     GetVersionEx(
1620: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  &sInfo);.      s
1630: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1640: 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72   sInfo.dwPlatfor
1650: 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52  mId==VER_PLATFOR
1660: 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a  M_WIN32_NT ? 2 :
1670: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
1680: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f  turn sqlite3_os_
1690: 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e  type==2;.  }.#en
16a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
16b0: 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINCE */../*.**
16c0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
16d0: 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f   string to micro
16e0: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55 54  soft unicode (UT
16f0: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
1700: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1710: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1720: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1730: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  m malloc..*/.sta
1740: 74 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54  tic WCHAR *utf8T
1750: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
1760: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1770: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20  .  int nChar;.  
1780: 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65  WCHAR *zWideFile
1790: 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  name;..  nChar =
17a0: 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
17b0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
17c0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
17d0: 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69 64  NULL, 0);.  zWid
17e0: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c  eFilename = mall
17f0: 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  oc( nChar*sizeof
1800: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
1810: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
1820: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
1830: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1840: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74  }.  nChar = Mult
1850: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
1860: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
1870: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
1880: 46 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72 29  Filename, nChar)
1890: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
18a0: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 57 69   ){.    free(zWi
18b0: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
18c0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
18d0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
18e0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
18f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1900: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
1910: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
1920: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1930: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
1940: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
1950: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
1960: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
1970: 69 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73  icodeToUtf8(cons
1980: 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69  t WCHAR *zWideFi
1990: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
19a0: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
19b0: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74  ilename;..  nByt
19c0: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
19d0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
19e0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
19f0: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
1a00: 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20  0);.  zFilename 
1a10: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
1a20: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
1a30: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1a40: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1a50: 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d  te = WideCharToM
1a60: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
1a70: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
1a80: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
1a90: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, nByte,.      
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20          0, 0);. 
1ac0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
1ad0: 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c  ){.    free(zFil
1ae0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
1af0: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
1b00: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1b10: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
1b20: 65 72 74 20 61 6e 20 61 6e 73 69 20 73 74 72 69  ert an ansi stri
1b30: 6e 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20  ng to microsoft 
1b40: 75 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f  unicode, based o
1b50: 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
1b60: 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e   codepage settin
1b70: 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73  gs for file apis
1b80: 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74  ..** .** Space t
1b90: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
1ba0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
1bb0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d  tained.** from m
1bc0: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
1bd0: 20 57 43 48 41 52 20 2a 6d 62 63 73 54 6f 55 6e   WCHAR *mbcsToUn
1be0: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
1bf0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1c00: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 43 48  int nByte;.  WCH
1c10: 41 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  AR *zMbcsFilenam
1c20: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
1c30: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
1c40: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
1c50: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
1c60: 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54  yte = MultiByteT
1c70: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
1c80: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
1c90: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73 69  , -1, NULL,0)*si
1ca0: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 7a  zeof(WCHAR);.  z
1cb0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 6d  MbcsFilename = m
1cc0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
1cd0: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
1ce0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
1cf0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
1d00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1d10: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 4d  .  }.  nByte = M
1d20: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
1d30: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
1d40: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
1d50: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  MbcsFilename, nB
1d60: 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  yte);.  if( nByt
1d70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65  e==0 ){.    free
1d80: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
1d90: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
1da0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
1db0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
1dc0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
1dd0: 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75  vert microsoft u
1de0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 62  nicode to multib
1df0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
1e00: 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74  ring, based on t
1e10: 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 6e 73  he.** user's Ans
1e20: 69 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a  i codepage..**.*
1e30: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
1e40: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
1e50: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
1e60: 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  from.** malloc()
1e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1e80: 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28   *unicodeToMbcs(
1e90: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57 69  const WCHAR *zWi
1ea0: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
1eb0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
1ec0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
1ed0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72  nt codepage = Ar
1ee0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
1ef0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
1f00: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
1f10: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
1f20: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
1f30: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
1f40: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
1f50: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6d  .  zFilename = m
1f60: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
1f70: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1f80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f90: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
1fa0: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  = WideCharToMult
1fb0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
1fc0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1fd0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
1fe0: 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20   nByte,.        
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
2010: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
2020: 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65 6e  .    free(zFilen
2030: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
2040: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
2050: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
2060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
2070: 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  t multibyte char
2080: 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20  acter string to 
2090: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
20a0: 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74   hold the.** ret
20b0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
20c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
20d0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
20e0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
20f0: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
2100: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2110: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
2120: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43 48  enameUtf8;.  WCH
2130: 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  AR *zTmpWide;.. 
2140: 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73   zTmpWide = mbcs
2150: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
2160: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
2170: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
2180: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
2190: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75  FilenameUtf8 = u
21a0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d  nicodeToUtf8(zTm
21b0: 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a  pWide);.  free(z
21c0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
21d0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
21e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
21f0: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
2200: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
2210: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
2220: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
2230: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
2240: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2250: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
2260: 74 69 63 20 63 68 61 72 20 2a 75 74 66 38 54 6f  tic char *utf8To
2270: 4d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  Mbcs(const char 
2280: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
2290: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
22a0: 63 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d  cs;.  WCHAR *zTm
22b0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
22c0: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
22d0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
22e0: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
22f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2300: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
2310: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54  eMbcs = unicodeT
2320: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
2330: 0a 20 20 66 72 65 65 28 7a 54 6d 70 57 69 64 65  .  free(zTmpWide
2340: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
2350: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 23 69  enameMbcs;.}..#i
2360: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2370: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
2380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
23c0: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
23d0: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
23e0: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a  inCE only..*/./*
23f0: 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f  .** WindowsCE do
2400: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  es not have a lo
2410: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
2420: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61  on.  So create a
2430: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a  .** substitute..
2440: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
2450: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
2460: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
2470: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
2480: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
2490: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
24a0: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
24b0: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
24c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
24d0: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
24e0: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
24f0: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
2500: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
2510: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
2520: 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
2530: 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
2540: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
2550: 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
2560: 32 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f  2);.  FileTimeTo
2570: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75  LocalFileTime(&u
2580: 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65  Tm,&lTm);.  File
2590: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
25a0: 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79  (&lTm,&pTm);.  y
25b0: 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77  .tm_year = pTm.w
25c0: 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79  Year - 1900;.  y
25d0: 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_mon = pTm.wM
25e0: 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d  onth - 1;.  y.tm
25f0: 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _wday = pTm.wDay
2600: 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d  OfWeek;.  y.tm_m
2610: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a  day = pTm.wDay;.
2620: 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54    y.tm_hour = pT
2630: 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f  m.wHour;.  y.tm_
2640: 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74  min = pTm.wMinut
2650: 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20  e;.  y.tm_sec = 
2660: 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72  pTm.wSecond;.  r
2670: 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20  eturn &y;.}../* 
2680: 54 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  This will never 
2690: 62 65 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64  be called, but d
26a0: 65 66 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74  efined to make t
26b0: 68 65 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20  he code compile 
26c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65  */.#define GetTe
26d0: 6d 70 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64  mpPathA(a,b)..#d
26e0: 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61  efine LockFile(a
26f0: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20  ,b,c,d,e)       
2700: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61  winceLockFile(&a
2710: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64  , b, c, d, e).#d
2720: 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  efine UnlockFile
2730: 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20  (a,b,c,d,e)     
2740: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
2750: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  &a, b, c, d, e).
2760: 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65  #define LockFile
2770: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
2780: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45    winceLockFileE
2790: 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  x(&a, b, c, d, e
27a0: 2c 20 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41  , f)..#define HA
27b0: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
27c0: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
27d0: 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f  char*)a)[-(int)o
27e0: 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c  ffsetof(winFile,
27f0: 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  h)]../*.** Acqui
2800: 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  re a lock on the
2810: 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61   handle h.*/.sta
2820: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75  tic void winceMu
2830: 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c  texAcquire(HANDL
2840: 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64  E h){.   DWORD d
2850: 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20  wErr;.   do {.  
2860: 20 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46     dwErr = WaitF
2870: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68  orSingleObject(h
2880: 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20  , INFINITE);.   
2890: 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21  } while (dwErr !
28a0: 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20  = WAIT_OBJECT_0 
28b0: 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54  && dwErr != WAIT
28c0: 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f  _ABANDONED);.}./
28d0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c  *.** Release a l
28e0: 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20  ock acquired by 
28f0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
2900: 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77  e().*/.#define w
2910: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
2920: 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78  (h) ReleaseMutex
2930: 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  (h)../*.** Creat
2940: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
2950: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73  shared memory us
2960: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69  ed for locking i
2970: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65  n the file.** de
2980: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a  scriptor pFile.*
2990: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
29a0: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f  nceCreateLock(co
29b0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
29c0: 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46  ame, winFile *pF
29d0: 69 6c 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a  ile){.  WCHAR *z
29e0: 54 6f 6b 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4e  Tok;.  WCHAR *zN
29f0: 61 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ame = utf8ToUnic
2a00: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
2a10: 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54    BOOL bInit = T
2a20: 52 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  RUE;..  /* Initi
2a30: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
2a40: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 5a 65  lockdata */.  Ze
2a50: 72 6f 4d 65 6d 6f 72 79 28 26 70 46 69 6c 65 2d  roMemory(&pFile-
2a60: 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f 66 28 70  >local, sizeof(p
2a70: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a  File->local));..
2a80: 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
2a90: 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f   backslashes fro
2aa0: 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  m the filename a
2ab0: 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a  nd lowercase it.
2ac0: 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61    ** to derive a
2ad0: 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a   mutex name. */.
2ae0: 20 20 7a 54 6f 6b 20 3d 20 43 68 61 72 4c 6f 77    zTok = CharLow
2af0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f  erW(zName);.  fo
2b00: 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b  r (;*zTok;zTok++
2b10: 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b  ){.    if (*zTok
2b20: 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20   == '\\') *zTok 
2b30: 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = '_';.  }..  /*
2b40: 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65   Create/open the
2b50: 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a   named mutex */.
2b60: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
2b70: 3d 20 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  = CreateMutexW(N
2b80: 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
2b90: 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
2ba0: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
2bb0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
2bc0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
2bd0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 6d 65  ;.    free(zName
2be0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  );.    return FA
2bf0: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  LSE;.  }..  /* A
2c00: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
2c10: 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
2c20: 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74  ng */.  winceMut
2c30: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
2c40: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f  >hMutex);.  .  /
2c50: 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65  * Since the name
2c60: 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78  s of named mutex
2c70: 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20  es, semaphores, 
2c80: 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74  file mappings et
2c90: 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65  c are .  ** case
2ca0: 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65  -sensitive, take
2cb0: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
2cc0: 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e  at by uppercasin
2cd0: 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65  g the mutex name
2ce0: 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20  .  ** and using 
2cf0: 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72  that as the shar
2d00: 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e  ed filemapping n
2d10: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61 72  ame..  */.  Char
2d20: 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  UpperW(zName);. 
2d30: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
2d40: 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  = CreateFileMapp
2d50: 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
2d60: 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
2d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
2da0: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
2db0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a       zName);  ..
2df0: 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20    /* Set a flag 
2e00: 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77  that indicates w
2e10: 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74  e're the first t
2e20: 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d  o create the mem
2e30: 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20  ory so it .  ** 
2e40: 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69  must be zero-ini
2e50: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66  tialized */.  if
2e60: 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   (GetLastError()
2e70: 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44   == ERROR_ALREAD
2e80: 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62  Y_EXISTS){.    b
2e90: 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20  Init = FALSE;.  
2ea0: 7d 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d 65 29  }..  free(zName)
2eb0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75  ;..  /* If we su
2ec0: 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e  cceeded in makin
2ed0: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
2ee0: 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20  ory handle, map 
2ef0: 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  it. */.  if (pFi
2f00: 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20  le->hShared){.  
2f10: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20    pFile->shared 
2f20: 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 4d 61  = (winceLock*)Ma
2f30: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
2f40: 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20  e->hShared, .   
2f50: 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
2f60: 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
2f70: 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
2f80: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
2f90: 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
2fa0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
2fb0: 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
2fc0: 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
2fd0: 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
2fe0: 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f (!pFile->share
2ff0: 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
3000: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
3010: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
3020: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3030: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
3040: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
3050: 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
3060: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3070: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
3080: 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
3090: 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
30a0: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
30b0: 6c 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  l */.  if (pFile
30c0: 2d 3e 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c  ->hShared == NUL
30d0: 4c 29 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74  L){.    winceMut
30e0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
30f0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 43 6c  >hMutex);.    Cl
3100: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
3110: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
3120: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
3130: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  LL;.    return F
3140: 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ALSE;.  }.  .  /
3150: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
3160: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
3170: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
3180: 20 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e   to */.  if (bIn
3190: 69 74 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d 65  it) {.    ZeroMe
31a0: 6d 6f 72 79 28 70 46 69 6c 65 2d 3e 73 68 61 72  mory(pFile->shar
31b0: 65 64 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65  ed, sizeof(wince
31c0: 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77  Lock));.  }..  w
31d0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
31e0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
31f0: 0a 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  .  return TRUE;.
3200: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
3210: 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e   the part of win
3220: 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20  File that deals 
3230: 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73  with wince locks
3240: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3250: 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
3260: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
3270: 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  {.  if (pFile->h
3280: 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41  Mutex){.    /* A
3290: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
32a0: 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
32b0: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
32c0: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >hMutex);..    /
32d0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
32e0: 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72  blocks should pr
32f0: 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e  obably assert in
3300: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74   debug mode, but
3310: 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65   they.       are
3320: 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63   to cleanup in c
3330: 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65  ase any locks re
3340: 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20  mained open */. 
3350: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
3360: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
3370: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3380: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
3390: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
33a0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
33b0: 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46  erved){.      pF
33c0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
33d0: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
33e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
33f0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
3400: 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
3410: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
3420: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
3430: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
3440: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
3450: 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ve){.      pFile
3460: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3470: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
3480: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72    }..    /* De-r
3490: 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f  eference and clo
34a0: 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74  se our copy of t
34b0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
34c0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 55   handle */.    U
34d0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
34e0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
34f0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3500: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
3510: 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
3520: 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
3530: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
3540: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
3550: 65 78 29 3b 20 20 20 20 0a 20 20 20 20 43 6c 6f  ex);    .    Clo
3560: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
3570: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
3580: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
3590: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
35a0: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
35b0: 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
35c0: 6c 65 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64  le() API of wind
35d0: 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f  ows for wince.*/
35e0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
35f0: 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  ceLockFile(.  HA
3600: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
3610: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
3620: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
3630: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
3640: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
3650: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
3660: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
3670: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
3680: 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
3690: 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
36a0: 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
36b0: 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
36c0: 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
36d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36e0: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
36f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
3700: 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
3710: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
3720: 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
3730: 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
3740: 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
3750: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
3760: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
3770: 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
3780: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
3790: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
37a0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
37b0: 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
37c0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
37d0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
37e0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
37f0: 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
3800: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
3810: 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
3820: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
3830: 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
3840: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3850: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
3860: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
3870: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
3880: 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
3890: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
38a0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
38b0: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
38c0: 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
38d0: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
38e0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
38f0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
3900: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
3910: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
3920: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
3930: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
3940: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
3950: 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
3960: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
3970: 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
3980: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
3990: 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
39a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
39b0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
39c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
39d0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
39e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
39f0: 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
3a00: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
3a10: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
3a20: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
3a30: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
3a40: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
3a50: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f  Low == 1){.    /
3a60: 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20  * If no pending 
3a70: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63  lock has been ac
3a80: 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71  quired, then acq
3a90: 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  uire it */.    i
3aa0: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
3ab0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29  ->bPending == 0)
3ac0: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
3ad0: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
3ae0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70   = TRUE;.      p
3af0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
3b00: 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20  ding = TRUE;.   
3b10: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
3b20: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
3b30: 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76  /* Want a reserv
3b40: 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ed lock? */.  el
3b50: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
3b60: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
3b70: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26  )RESERVED_BYTE &
3b80: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3b90: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3ba0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3bb0: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
3bc0: 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
3bd0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3be0: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
3bf0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
3c00: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
3c10: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
3c20: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
3c30: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
3c40: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
3c50: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
3c60: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
3c70: 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
3c80: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
3c90: 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
3ca0: 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e   windows for win
3cb0: 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  ce.*/.static BOO
3cc0: 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c  L winceUnlockFil
3cd0: 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  e(.  HANDLE *phF
3ce0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
3cf0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
3d00: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
3d10: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
3d20: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3d30: 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  UnlockLow,.  DWO
3d40: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
3d50: 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b  sToUnlockHigh.){
3d60: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
3d70: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
3d80: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
3d90: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
3da0: 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
3db0: 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
3dc0: 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
3dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3de0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
3df0: 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  oUnlockHigh);.. 
3e00: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
3e10: 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
3e20: 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
3e30: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
3e40: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  tex);..  /* Rele
3e50: 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c  asing a reader l
3e60: 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  ock or an exclus
3e70: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  ive lock */.  if
3e80: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
3e90: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
3ea0: 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f  ED_FIRST){.    /
3eb0: 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e  * Did we have an
3ec0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
3ed0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
3ee0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
3ef0: 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ive){.      asse
3f00: 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
3f10: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
3f20: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
3f30: 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ZE);.      pFile
3f40: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
3f50: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
3f60: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
3f70: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
3f80: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
3f90: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
3fa0: 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  ..    /* Did we 
3fb0: 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64  just have a read
3fc0: 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  er lock? */.    
3fd0: 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e  else if (pFile->
3fe0: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
3ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
4000: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
4010: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
4020: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c  D)SHARED_SIZE ||
4030: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
4040: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
4050: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
4060: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d  ocal.nReaders --
4070: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
4080: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
4090: 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
40a0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
40b0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
40c0: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
40d0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
40f0: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65  * Releasing a pe
4100: 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
4110: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
4120: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
4130: 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  RD)PENDING_BYTE 
4140: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
4150: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
4160: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
4170: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
4180: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
4190: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
41a0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
41b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
41c0: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
41d0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
41e0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
41f0: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
4200: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
4210: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
4220: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
4230: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
4240: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
4250: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
4260: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
4270: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
4280: 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20  eserved) {.     
4290: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
42a0: 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
42b0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
42c0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
42d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
42e0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
42f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63     }.  }..  winc
4300: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
4310: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
4320: 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a  return bReturn;.
4330: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c  }../*.** An impl
4340: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
4350: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
4360: 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f  PI of windows fo
4370: 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  r wince.*/.stati
4380: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
4390: 46 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c 45  FileEx(.  HANDLE
43a0: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
43b0: 44 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57 4f  D dwFlags,.  DWO
43c0: 52 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a 20  RD dwReserved,. 
43d0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
43e0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
43f0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
4400: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
4410: 2c 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44  ,.  LPOVERLAPPED
4420: 20 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29 7b   lpOverlapped.){
4430: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
4440: 54 45 52 28 64 77 52 65 73 65 72 76 65 64 29 3b  TER(dwReserved);
4450: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
4460: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
4470: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
4480: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
4490: 65 72 20 77 61 6e 74 73 20 61 20 73 68 61 72 65  er wants a share
44a0: 64 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f 72  d read lock, for
44b0: 77 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a 20  ward this call. 
44c0: 20 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63 6b   ** to winceLock
44d0: 46 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c 70  File */.  if (lp
44e0: 4f 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66 73  Overlapped->Offs
44f0: 65 74 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  et == (DWORD)SHA
4500: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
4510: 20 20 20 64 77 46 6c 61 67 73 20 3d 3d 20 31 20     dwFlags == 1 
4520: 26 26 0a 20 20 20 20 20 20 6e 4e 75 6d 62 65 72  &&.      nNumber
4530: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
4540: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
4550: 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72 65 74  D_SIZE){.    ret
4560: 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
4570: 65 28 70 68 46 69 6c 65 2c 20 53 48 41 52 45 44  e(phFile, SHARED
4580: 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
4590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46  ;.  }.  return F
45a0: 41 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e  ALSE;.}./*.** En
45b0: 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  d of the special
45c0: 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a   code for wince.
45d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
4620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4630: 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a  OS_WINCE */../**
4640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
4690: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
46a0: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
46b0: 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
46c0: 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
46d0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
46e0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
46f0: 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
4700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4740: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d  */../*.** Some m
4750: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
4760: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
4770: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
4780: 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
4790: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
47a0: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
47b0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
47c0: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
47d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
47e0: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
47f0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
4800: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
4810: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
4820: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
4830: 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
4840: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
4850: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
4860: 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
4870: 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
4880: 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
4890: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
48a0: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69  tatic int seekWi
48b0: 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  nFile(winFile *p
48c0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
48d0: 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 20 20  t64 iOffset){.  
48e0: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
4910: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
4920: 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
4930: 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
4940: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
4950: 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
4960: 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
4970: 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
49a0: 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
49b0: 6e 74 65 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70  nter() */..  upp
49c0: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
49d0: 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  (iOffset>>32) & 
49e0: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c  0x7fffffff);.  l
49f0: 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  owerBits = (LONG
4a00: 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66  )(iOffset & 0xff
4a10: 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41  ffffff);..  /* A
4a20: 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75  PI oddity: If su
4a30: 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c  ccessful, SetFil
4a40: 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72  ePointer() retur
4a50: 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a  ns a dword .  **
4a60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4a70: 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
4a80: 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
4a90: 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
4aa0: 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
4ab0: 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
4ac0: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
4ad0: 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
4ae0: 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a  ng to MSDN, .  *
4af0: 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
4b00: 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
4b10: 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
4b20: 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
4b30: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
4b40: 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
4b50: 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
4b60: 63 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c  ccured, it is al
4b70: 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
4b80: 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
4b90: 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
4ba0: 20 20 64 77 52 65 74 20 3d 20 53 65 74 46 69 6c    dwRet = SetFil
4bb0: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
4bc0: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
4bd0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
4be0: 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 28 64 77  EGIN);.  if( (dw
4bf0: 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54  Ret==INVALID_SET
4c00: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26  _FILE_POINTER &&
4c10: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21   GetLastError()!
4c20: 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20  =NO_ERROR) ){.  
4c30: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
4c40: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
4c50: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
4c60: 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
4c70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
4c80: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
4c90: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
4ca0: 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
4cb0: 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
4cc0: 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
4cd0: 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
4ce0: 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
4cf0: 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
4d00: 62 75 74 20 77 69 6e 64 6f 77 73 20 69 73 20 6e  but windows is n
4d10: 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
4d20: 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
4d30: 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
4d40: 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
4d50: 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
4d60: 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
4d70: 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
4d80: 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
4d90: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
4da0: 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
4db0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
4dc0: 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
4dd0: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
4de0: 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
4df0: 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
4e00: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
4e10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
4e20: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
4e30: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
4e40: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
4e50: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
4e60: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
4e70: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
4e80: 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
4e90: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
4ea0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
4eb0: 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  pShm==0 );.  OST
4ec0: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
4ed0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
4ee0: 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 43    do{.    rc = C
4ef0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
4f00: 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
4f10: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
4f20: 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
4f30: 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
4f40: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
4f50: 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
4f60: 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
4f70: 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  Sleep(100), 1) )
4f80: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
4f90: 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49  WINCE.#define WI
4fa0: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
4fb0: 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44  EMPTS 3.  winceD
4fc0: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
4fd0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
4fe0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
4ff0: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
5000: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
5010: 20 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46           DeleteF
5020: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
5030: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
5040: 20 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c         && GetFil
5050: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
5060: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
5070: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
5080: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
5090: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
50a0: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
50b0: 29 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28  ){.       Sleep(
50c0: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
50d0: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
50e0: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
50f0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46     }.    free(pF
5100: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
5110: 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ose);.  }.#endif
5120: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
5130: 53 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  SE %d %s\n", pFi
5140: 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
5150: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
5160: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
5170: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
5180: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
5190: 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_IOERR;.}../*.
51a0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
51b0: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
51c0: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
51d0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
51e0: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
51f0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
5200: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
5210: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
5220: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
5230: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
5240: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
5250: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
5260: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
5270: 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
5280: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
5290: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
52a0: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
52b0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
52c0: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
52d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
52e0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
52f0: 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
5300: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
5310: 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
5320: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
5330: 65 74 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  et */.){.  winFi
5340: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
5350: 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
5360: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
5370: 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5390: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
53a0: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
53b0: 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  from file */..  
53c0: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
53d0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
53e0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
53f0: 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
5400: 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 25  OSTRACE(("READ %
5410: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
5420: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
5430: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 69 66  ocktype));..  if
5440: 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  ( seekWinFile(pF
5450: 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
5460: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5470: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 69 66  E_FULL;.  }.  if
5480: 28 20 21 52 65 61 64 46 69 6c 65 28 70 46 69 6c  ( !ReadFile(pFil
5490: 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
54a0: 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 20   &nRead, 0) ){. 
54b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
54c0: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
54d0: 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  or();.    return
54e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
54f0: 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  AD;.  }.  if( nR
5500: 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
5510: 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
5520: 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
5530: 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
5540: 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
5550: 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
5560: 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
5570: 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
5580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
5590: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
55a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
55b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
55c0: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
55d0: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
55e0: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
55f0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5600: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
5610: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
5620: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
5630: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
5640: 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
5650: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
5660: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
5670: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
5680: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
5690: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
56a0: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74    /* The bytes t
56b0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
56c0: 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
56f0: 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
5700: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
5710: 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   offset         
5720: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
5730: 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
5740: 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
5750: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5780: 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  f error has occu
5790: 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
57a0: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
57b0: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
57c0: 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
57d0: 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
57e0: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73  ( amt>0 );.  ass
57f0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
5800: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
5810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
5820: 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69  ERR_WRITE);.  Si
5830: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
5840: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
5850: 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52  E_FULL);..  OSTR
5860: 41 43 45 28 28 22 57 52 49 54 45 20 25 64 20 6c  ACE(("WRITE %d l
5870: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
5880: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
5890: 74 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d 20  type));..  rc = 
58a0: 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
58b0: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  e, offset);.  if
58c0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  ( rc==0 ){.    u
58d0: 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
58e0: 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
58f0: 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
5900: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
5910: 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
5920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5930: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
5940: 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
5950: 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
5960: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
5970: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
5980: 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
5990: 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
59a0: 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  */..    while( n
59b0: 52 65 6d 3e 30 20 26 26 20 57 72 69 74 65 46 69  Rem>0 && WriteFi
59c0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
59d0: 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
59e0: 2c 20 30 29 20 26 26 20 6e 57 72 69 74 65 3e 30  , 0) && nWrite>0
59f0: 20 29 7b 0a 20 20 20 20 20 20 61 52 65 6d 20 2b   ){.      aRem +
5a00: 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
5a10: 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
5a20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
5a30: 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
5a40: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
5a50: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
5a60: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
5a70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
5a80: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  rc ){.    if( pF
5a90: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
5aa0: 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53  ERROR_HANDLE_DIS
5ab0: 4b 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  K_FULL ){.      
5ac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
5ad0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
5ae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
5af0: 52 5f 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  R_WRITE;.  }.  r
5b00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
5b20: 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
5b30: 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
5b40: 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
5b50: 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71  t winTruncate(sq
5b60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
5b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
5b80: 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  yte){.  winFile 
5b90: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5ba0: 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
5bb0: 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  handle object */
5bc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5bd0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
5be0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
5bf0: 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  e for this funct
5c00: 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
5c10: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53  ( pFile );..  OS
5c20: 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
5c30: 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69   %d %lld\n", pFi
5c40: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a  le->h, nByte));.
5c50: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
5c60: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
5c70: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
5c80: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
5c90: 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
5ca0: 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
5cb0: 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
5cc0: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
5cd0: 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
5ce0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
5cf0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
5d00: 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
5d10: 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
5d20: 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
5d30: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
5d40: 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
5d50: 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
5d60: 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
5d70: 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
5d80: 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  nk ){.    nByte 
5d90: 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
5da0: 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
5db0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
5dc0: 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
5dd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
5de0: 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
5df0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
5e00: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
5e10: 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
5e20: 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ls. */.  if( see
5e30: 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
5e40: 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
5e50: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
5e60: 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73  TRUNCATE;.  }els
5e70: 65 20 69 66 28 20 30 3d 3d 53 65 74 45 6e 64 4f  e if( 0==SetEndO
5e80: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
5e90: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
5ea0: 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
5eb0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
5ec0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
5ed0: 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 0a 0a 20  TRUNCATE;.  }.. 
5ee0: 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
5ef0: 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e  ATE %d %lld %s\n
5f00: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  ", pFile->h, nBy
5f10: 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64  te, rc ? "failed
5f20: 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65  " : "ok"));.  re
5f30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5f40: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
5f50: 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
5f60: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
5f70: 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
5f80: 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
5f90: 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
5fa0: 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
5fb0: 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
5fc0: 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
5fd0: 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
5fe0: 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
5ff0: 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
6000: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
6010: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
6020: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
6030: 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
6040: 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
6050: 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
6060: 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
6070: 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69  int winSync(sqli
6080: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
6090: 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 20 21 64  t flags){.#if !d
60a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
60b0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
60c0: 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 64 65  E_NO_SYNC) || de
60d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
60e0: 55 47 29 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  UG).  winFile *p
60f0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
6100: 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  )id;.#else.  UNU
6110: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
6120: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
6130: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
6140: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
6150: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
6160: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
6170: 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
6180: 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
6190: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
61a0: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
61b0: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
61c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
61d0: 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28    );..  OSTRACE(
61e0: 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25  ("SYNC %d lock=%
61f0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
6200: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
6210: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
6220: 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44  TE_TEST.  UNUSED
6230: 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73  _PARAMETER(flags
6240: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 66  );.#else.  if( f
6250: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 59  lags & SQLITE_SY
6260: 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
6270: 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
6280: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
6290: 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
62a0: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
62b0: 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
62c0: 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
62d0: 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
62e0: 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
62f0: 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
6300: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
6310: 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
6320: 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
6330: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
6340: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
6350: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
6360: 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 53 69 6d  TE_FULL );.  Sim
6370: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
6380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
6390: 52 3b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  R; );..  /* If w
63a0: 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
63b0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
63c0: 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
63d0: 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
63e0: 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
63f0: 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
6400: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6410: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  _OK;.#else.  if(
6420: 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72   FlushFileBuffer
6430: 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  s(pFile->h) ){. 
6440: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6450: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
6460: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
6470: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
6480: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
6490: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
64a0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
64b0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
64c0: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
64d0: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
64e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
64f0: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
6500: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
6510: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
6520: 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  ){.  DWORD upper
6530: 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f  Bits;.  DWORD lo
6540: 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69  werBits;.  winFi
6550: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
6560: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
6570: 44 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65  D error;..  asse
6580: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
6590: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
65a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
65b0: 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77  RR_FSTAT);.  low
65c0: 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65  erBits = GetFile
65d0: 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
65e0: 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 66  upperBits);.  if
65f0: 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d  (   (lowerBits =
6600: 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53  = INVALID_FILE_S
6610: 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 65  IZE).     && ((e
6620: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
6630: 72 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52  ror()) != NO_ERR
6640: 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70 46  OR) ).  {.    pF
6650: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
6660: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
6670: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
6680: 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
6690: 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
66a0: 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
66b0: 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
66c0: 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ts;.  return SQL
66d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
66e0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
66f0: 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
6700: 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
6710: 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
6720: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
6730: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
6740: 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
6750: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
6760: 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
6770: 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
6780: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
6790: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
67a0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
67b0: 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
67c0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
67d0: 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
67e0: 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  5 or WinNT..*/.s
67f0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
6800: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
6810: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
6820: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
6830: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
6840: 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e   ovlp;.    ovlp.
6850: 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f  Offset = SHARED_
6860: 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e  FIRST;.    ovlp.
6870: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a  OffsetHigh = 0;.
6880: 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20      ovlp.hEvent 
6890: 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  = 0;.    res = L
68a0: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
68b0: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
68c0: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20  L_IMMEDIATELY,. 
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68e0: 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49      0, SHARED_SI
68f0: 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f  ZE, 0, &ovlp);./
6900: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
6910: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
6920: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
6930: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
6940: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
6950: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
6960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
6970: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
6980: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
6990: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
69a0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
69b0: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
69c0: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
69d0: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
69e0: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
69f0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
6a00: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6a10: 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
6a20: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
6a30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
6a40: 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
6a50: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
6a60: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
6a70: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
6a80: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
6a90: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
6aa0: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
6ab0: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
6ac0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
6ad0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
6ae0: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
6af0: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
6b00: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
6b10: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
6b20: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69  D_SIZE, 0);./* i
6b30: 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
6b40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
6b50: 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
6b60: 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
6b70: 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  . .*/.#if SQLITE
6b80: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
6b90: 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
6ba0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
6bb0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6bc0: 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  T + pFile->share
6bd0: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
6be0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
6bf0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
6c00: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
6c10: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
6c20: 45 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  Error();.  }.  r
6c30: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
6c40: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
6c50: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
6c60: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
6c70: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
6c80: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
6c90: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
6ca0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
6cb0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
6cc0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
6cd0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
6ce0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
6cf0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
6d00: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
6d10: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
6d20: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
6d30: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
6d40: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
6d50: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
6d60: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
6d70: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
6d80: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
6d90: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
6da0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
6db0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
6dc0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
6dd0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
6de0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
6df0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
6e00: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
6e10: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
6e20: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
6e30: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
6e40: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
6e50: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
6e60: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
6e70: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
6e80: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
6e90: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
6ea0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
6eb0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
6ec0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
6ed0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
6ee0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
6ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6f00: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
6f10: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
6f20: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
6f30: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
6f40: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
6f50: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
6f60: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
6f70: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
6f80: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
6f90: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
6fa0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
6fb0: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
6fc0: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
6fd0: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
6fe0: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
6ff0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
7000: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
7010: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
7020: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
7030: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7040: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
7050: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
7060: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
7070: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
7080: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77  /* Result of a w
7090: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
70a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
70b0: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
70c0: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
70d0: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
70e0: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
70f0: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
7100: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
7110: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
7120: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
7130: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
7140: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
7150: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
7160: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d  .  DWORD error =
7170: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
7180: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
7190: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
71a0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
71b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
71c0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
71d0: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
71e0: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
71f0: 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20  edLockByte));.. 
7200: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
7210: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
7220: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
7230: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
7240: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
7250: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
7260: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
7270: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
7280: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
7290: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
72a0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
72b0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
72c0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
72d0: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
72e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
72f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
7300: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
7310: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
7320: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
7330: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
7340: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
7350: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
7360: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
7370: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
7380: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
7390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
73a0: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
73b0: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
73c0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
73d0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
73e0: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
73f0: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
7400: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
7410: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
7420: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
7430: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
7440: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
7450: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
7460: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
7470: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
7480: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
7490: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
74a0: 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
74b0: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
74c0: 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
74d0: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
74e0: 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
74f0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
7500: 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
7510: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
7520: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
7530: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
7540: 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
7550: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
7560: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
7570: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
7580: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
7590: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
75a0: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
75b0: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
75c0: 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e  ock.  The pendin
75d0: 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a  g lock might be.
75e0: 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79        ** held by
75f0: 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20   another reader 
7600: 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c  process who will
7610: 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65   release it mome
7620: 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a  ntarily..      *
7630: 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
7640: 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
7650: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
7660: 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
7670: 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29  ;.      Sleep(1)
7680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
7690: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
76a0: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
76b0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
76c0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
76d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
76e0: 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
76f0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
7700: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
7710: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
7720: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
7730: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
7740: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
7750: 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70   = getReadLock(p
7760: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
7770: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7780: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
7790: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
77a0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
77b0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
77c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
77d0: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
77e0: 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
77f0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
7800: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
7810: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
7820: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
7830: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
7840: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
7850: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
7860: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
7870: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
7880: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7890: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
78a0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
78b0: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
78c0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
78d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
78e0: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
78f0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
7900: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
7910: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
7920: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
7930: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
7940: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
7950: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
7960: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
7970: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
7980: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
7990: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
79a0: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
79b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
79c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
79d0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
79e0: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
79f0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
7a00: 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65    OSTRACE(("unre
7a10: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
7a20: 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  res));.    res =
7a30: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
7a40: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
7a50: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
7a60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
7a70: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
7a80: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
7a90: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
7aa0: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7ab0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7ac0: 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
7ad0: 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25  ("error-code = %
7ae0: 64 5c 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20  d\n", error));. 
7af0: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
7b00: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
7b10: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
7b20: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
7b30: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
7b40: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
7b50: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
7b60: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
7b70: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
7b80: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
7b90: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
7ba0: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7bb0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
7bc0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
7bd0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
7be0: 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
7bf0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
7c00: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
7c10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
7c20: 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
7c30: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
7c40: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
7c50: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
7c60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7c70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
7c80: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49  TRACE(("LOCK FAI
7c90: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
7ca0: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
7cb0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
7cc0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
7cd0: 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
7ce0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
7cf0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
7d00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7d10: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  BUSY;.  }.  pFil
7d20: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
7d30: 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
7d40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7d50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7d60: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
7d70: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
7d80: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
7d90: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
7da0: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
7db0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
7dc0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
7dd0: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
7de0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
7df0: 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
7e00: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
7e10: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
7e20: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
7e30: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
7e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
7e50: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
7e60: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
7e70: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
7e80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7e90: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
7ea0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
7eb0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
7ec0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
7ed0: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
7ee0: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  CK ){.    rc = 1
7ef0: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
7f00: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
7f10: 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
7f20: 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
7f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7f40: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
7f50: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
7f60: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
7f70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
7f80: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
7f90: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
7fa0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
7fb0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
7fc0: 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  c;.    OSTRACE((
7fd0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
7fe0: 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c   %d (remote)\n",
7ff0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
8000: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
8010: 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53  = rc;.  return S
8020: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8030: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
8040: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
8050: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64  le descriptor id
8060: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
8070: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
8080: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
8090: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
80a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
80b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
80c0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
80d0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
80e0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
80f0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
8100: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
8110: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
8120: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  op..**.** It is 
8130: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
8140: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
8150: 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63   fail if the sec
8160: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
8170: 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20  is NO_LOCK.  If 
8180: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8190: 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f  ent is SHARED_LO
81a0: 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  CK then this rou
81b0: 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65  tine.** might re
81c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
81d0: 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R;.*/.static int
81e0: 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   winUnlock(sqlit
81f0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
8200: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
8210: 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c  t type;.  winFil
8220: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
8230: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
8240: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8250: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
8260: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  0 );.  assert( l
8270: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
8280: 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43  LOCK );.  OSTRAC
8290: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f  E(("UNLOCK %d to
82a0: 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
82b0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
82c0: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
82d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
82e0: 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
82f0: 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70  ockByte));.  typ
8300: 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
8310: 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
8320: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
8330: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
8340: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
8350: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
8360: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
8370: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
8380: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
8390: 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
83a0: 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
83b0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
83c0: 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
83d0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
83e0: 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
83f0: 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
8400: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
8410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
8420: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  R_UNLOCK;.    }.
8430: 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
8440: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
8450: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
8460: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
8470: 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
8480: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  );.  }.  if( loc
8490: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  ktype==NO_LOCK &
84a0: 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  & type>=SHARED_L
84b0: 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  OCK ){.    unloc
84c0: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
84d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  ;.  }.  if( type
84e0: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
84f0: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
8500: 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  (pFile->h, PENDI
8510: 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
8520: 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
8530: 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c  locktype = (u8)l
8540: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
8550: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
8560: 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79  ontrol and query
8570: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
8580: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
8590: 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43  tic int winFileC
85a0: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
85b0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
85c0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
85d0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
85e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
85f0: 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
8600: 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
8610: 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29  rg = ((winFile*)
8620: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  id)->locktype;. 
8630: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8640: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
8650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
8660: 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
8670: 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
8680: 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a 29 69  int)((winFile*)i
8690: 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  d)->lastErrno;. 
86a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
86b0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
86c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
86d0: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
86e0: 0a 20 20 20 20 20 20 28 28 77 69 6e 46 69 6c 65  .      ((winFile
86f0: 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d  *)id)->szChunk =
8700: 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
8710: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8720: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
8730: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
8740: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
8750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
8760: 74 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74  t64 sz = *(sqlit
8770: 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
8780: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
8790: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
87a0: 20 20 20 20 20 20 77 69 6e 54 72 75 6e 63 61 74        winTruncat
87b0: 65 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20  e(id, sz);.     
87c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
87d0: 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
87e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
87f0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
8800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
8810: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OR;.}../*.** Ret
8820: 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
8830: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
8840: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
8850: 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
8860: 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
8870: 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
8880: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
8890: 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
88a0: 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
88b0: 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
88c0: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
88d0: 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
88e0: 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
88f0: 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
8900: 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
8910: 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
8920: 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
8930: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
8940: 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
8950: 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
8960: 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
8970: 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
8980: 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
8990: 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
89a0: 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
89b0: 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
89c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
89d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ){.  assert( id!
89e0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
89f0: 69 6e 74 29 28 28 28 77 69 6e 46 69 6c 65 2a 29  int)(((winFile*)
8a00: 69 64 29 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  id)->sectorSize)
8a10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8a20: 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65  n a vector of de
8a30: 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
8a40: 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tics..*/.static 
8a50: 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61  int winDeviceCha
8a60: 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
8a70: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
8a80: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8a90: 45 52 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  ER(id);.  return
8aa0: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
8ab0: 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
8ac0: 50 45 4e 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  PEN;.}..#ifndef 
8ad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8ae0: 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20  ./* .** Windows 
8af0: 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f  will only let yo
8b00: 75 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69  u create file vi
8b10: 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f  ew mappings.** o
8b20: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  n allocation siz
8b30: 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f  e granularity bo
8b40: 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72  undaries..** Dur
8b50: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  ing sqlite3_os_i
8b60: 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65  nit() we do a Ge
8b70: 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a  tSystemInfo().**
8b80: 20 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e   to get the gran
8b90: 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f  ularity size..*/
8ba0: 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e  .SYSTEM_INFO win
8bb0: 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20  SysInfo;../*.** 
8bc0: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
8bd0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
8be0: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
8bf0: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
8c00: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
8c10: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
8c20: 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e  ct the winLockIn
8c30: 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  fo objects used 
8c40: 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65  by .** this file
8c50: 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
8c60: 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20  ay be shared by 
8c70: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
8c80: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
8c90: 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
8ca0: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
8cb0: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
8cc0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
8cd0: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
8ce0: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
8cf0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
8d00: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
8d10: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
8d20: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
8d30: 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
8d40: 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
8d50: 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
8d60: 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
8d70: 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
8d80: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
8d90: 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  d winShmEnterMut
8da0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
8db0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
8dc0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
8dd0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
8de0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
8df0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
8e00: 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76  nShmLeaveMutex(v
8e10: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
8e20: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
8e30: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
8e40: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
8e50: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
8e60: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8e70: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  G.static int win
8e80: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  ShmMutexHeld(voi
8e90: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
8ea0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8eb0: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
8ec0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
8ed0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
8ee0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
8ef0: 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
8f00: 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67  represent a sing
8f10: 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  le file opened a
8f20: 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72  nd mmapped to pr
8f30: 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20  ovide.** shared 
8f40: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75  memory.  When mu
8f50: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
8f60: 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
8f70: 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   same.** log-sum
8f80: 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61  mary, each threa
8f90: 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69  d has its own wi
8fa0: 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75  nFile object, bu
8fb0: 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f  t they all.** po
8fc0: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
8fd0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
8fe0: 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
8ff0: 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a  er words, each.*
9000: 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73  * log-summary is
9010: 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63   opened only onc
9020: 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
9030: 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  *.** winShmMutex
9040: 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
9050: 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
9060: 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
9070: 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
9080: 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
9090: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
90a0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
90b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
90c0: 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a  .**      pNext .
90d0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
90e0: 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
90f0: 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
9100: 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
9110: 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
9120: 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
9130: 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
9140: 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  ther winShmNode.
9150: 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
9160: 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ld or winShmNode
9170: 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
9180: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
9190: 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
91a0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
91b0: 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
91c0: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
91d0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  ucture..**.*/.st
91e0: 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
91f0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
9200: 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
9210: 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
9220: 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
9230: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
9240: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
9250: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
9260: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68  e */.  winFile h
9270: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
9280: 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
9290: 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f   from winOpen */
92a0: 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  ..  int szRegion
92b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
92c0: 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
92d0: 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
92e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e  */.  int nRegion
92f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9300: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
9310: 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73   apRegion */.  s
9320: 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
9330: 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61  {.    HANDLE hMa
9340: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p;             /
9350: 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
9360: 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  om CreateFileMap
9370: 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64  ping */.    void
9380: 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65   *pMap;.  } *aRe
9390: 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61  gion;.  DWORD la
93a0: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
93b0: 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77     /* The Window
93c0: 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  s errno from the
93d0: 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
93e0: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20  */..  int nRef; 
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69   /* Number of wi
9410: 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
9420: 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
9430: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73  .  winShm *pFirs
9440: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
9450: 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65   All winShm obje
9460: 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
9470: 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
9480: 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  Node *pNext;    
9490: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20       /* Next in 
94a0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53  list of all winS
94b0: 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a  hmNode objects *
94c0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
94d0: 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53  DEBUG.  u8 nextS
94e0: 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
94f0: 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
9500: 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76  able winShm.id v
9510: 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
9520: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61  ;../*.** A globa
9530: 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77  l array of all w
9540: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
9550: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  s..**.** The win
9560: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
9570: 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c  ust be true whil
9580: 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
9590: 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a  ting this list..
95a0: 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d  */.static winShm
95b0: 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65  Node *winShmNode
95c0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
95d0: 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
95e0: 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
95f0: 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
9600: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
9610: 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
9620: 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
9630: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
9640: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
9650: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
9660: 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
9670: 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
9680: 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
9690: 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
96a0: 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e      winShm.pShmN
96b0: 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  ode.**    winShm
96c0: 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
96d0: 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
96e0: 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
96f0: 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d  winShm.pShmNode-
9700: 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
9710: 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
9720: 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
9730: 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
9740: 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b  .struct winShm {
9750: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
9760: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a  ShmNode;      /*
9770: 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
9780: 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
9790: 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  t */.  winShm *p
97a0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
97b0: 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d    /* Next winShm
97c0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77   with the same w
97d0: 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  inShmNode */.  u
97e0: 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
97f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
9800: 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
9810: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65   winShmNode mute
9820: 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
9830: 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
9840: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
9850: 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
9860: 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
9870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9880: 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
9890: 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
98a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
98b0: 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
98e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
98f0: 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20   its winShmNode 
9900: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
9910: 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
9920: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
9930: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
9940: 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
9950: 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
9960: 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  4)        /* fir
9970: 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
9980: 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
9990: 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f  DMS    (WIN_SHM_
99a0: 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
99b0: 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
99c0: 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
99d0: 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f  .** Apply adviso
99e0: 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
99f0: 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69   n bytes beginni
9a00: 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23  ng at ofst..*/.#
9a10: 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43  define _SHM_UNLC
9a20: 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  1.#define _SH
9a30: 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69  M_RDLCK  2.#defi
9a40: 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33  ne _SHM_WRLCK  3
9a50: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
9a60: 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
9a70: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c  winShmNode *pFil
9a80: 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c  e,    /* Apply l
9a90: 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
9aa0: 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
9ab0: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
9ac0: 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
9ad0: 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b     /* _SHM_UNLCK
9ae0: 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72  , _SHM_RDLCK, or
9af0: 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20   _SHM_WRLCK */. 
9b00: 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
9b10: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9b20: 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
9b30: 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f  o be locked/unlo
9b40: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  cked */.  int nB
9b50: 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
9b60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9b70: 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  es to lock or un
9b80: 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45  lock */.){.  OVE
9b90: 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
9ba0: 44 57 4f 52 44 20 64 77 46 6c 61 67 73 3b 0a 20  DWORD dwFlags;. 
9bb0: 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
9bc0: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
9bd0: 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f   code form Lock/
9be0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a  UnlockFileEx() *
9bf0: 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
9c00: 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  o the winShmNode
9c10: 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
9c20: 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
9c30: 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
9c40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9c50: 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
9c60: 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66  ) || pFile->nRef
9c70: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  ==0 );..  /* Ini
9c80: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
9c90: 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
9ca0: 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f  /.  dwFlags = LO
9cb0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
9cc0: 44 49 41 54 45 4c 59 3b 0a 20 20 69 66 28 20 6c  DIATELY;.  if( l
9cd0: 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
9ce0: 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20  WRLCK ) dwFlags 
9cf0: 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  |= LOCKFILE_EXCL
9d00: 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d  USIVE_LOCK;..  m
9d10: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
9d20: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
9d30: 44 29 29 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66 73  D));.  ovlp.Offs
9d40: 65 74 20 3d 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a  et = ofst;..  /*
9d50: 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
9d60: 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
9d70: 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
9d80: 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
9d90: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
9da0: 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46   UnlockFileEx(pF
9db0: 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c  ile->hFile.h, 0,
9dc0: 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70   nByte, 0, &ovlp
9dd0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9de0: 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28  rc = LockFileEx(
9df0: 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
9e00: 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74  dwFlags, 0, nByt
9e10: 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  e, 0, &ovlp);.  
9e20: 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20  }.  .  if( rc!= 
9e30: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
9e40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
9e50: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9e60: 74 45 72 72 6e 6f 20 3d 20 20 47 65 74 4c 61 73  tErrno =  GetLas
9e70: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
9e80: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
9e90: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
9ea0: 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20  "SHM-LOCK %d %s 
9eb0: 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a  %s 0x%08lx\n", .
9ec0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
9ed0: 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20  ->hFile.h,.     
9ee0: 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
9ef0: 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
9f00: 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20  iled",.         
9f10: 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d    lockType==_SHM
9f20: 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b  _UNLCK ? "Unlock
9f30: 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46  FileEx" : "LockF
9f40: 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20  ileEx",.        
9f50: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
9f60: 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  rno));..  return
9f70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
9f80: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
9f90: 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
9fa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
9fb0: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
9fc0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
9fd0: 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e  te3_file*,int,in
9fe0: 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
9ff0: 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65  winDelete(sqlite
a000: 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68  3_vfs *,const ch
a010: 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  ar*,int);../*.**
a020: 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68   Purge the winSh
a030: 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
a040: 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
a050: 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  th winShmNode.nR
a060: 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
a070: 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
a080: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
a090: 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
a0a0: 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
a0b0: 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
a0c0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
a0d0: 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
a0e0: 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65  void winShmPurge
a0f0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
a100: 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  fs, int deleteFl
a110: 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ag){.  winShmNod
a120: 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d  e **pp;.  winShm
a130: 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20  Node *p;.  BOOL 
a140: 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77  bRc;.  assert( w
a150: 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
a160: 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53   );.  pp = &winS
a170: 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68  hmNodeList;.  wh
a180: 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d  ile( (p = *pp)!=
a190: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
a1a0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
a1b0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
a1c0: 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c  ( p->mutex ) sql
a1d0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
a1e0: 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  p->mutex);.     
a1f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
a200: 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
a210: 20 20 20 20 20 20 62 52 63 20 3d 20 55 6e 6d 61        bRc = Unma
a220: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61  pViewOfFile(p->a
a230: 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b  Region[i].pMap);
a240: 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
a250: 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
a260: 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e  -%d unmap region
a270: 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
a280: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
a290: 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  )GetCurrentProce
a2a0: 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20  ssId(), i,.     
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20              bRc 
a2c0: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
a2d0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63  "));.        bRc
a2e0: 20 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   = CloseHandle(p
a2f0: 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
a300: 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
a310: 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
a320: 70 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67  pid-%d close reg
a330: 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
a350: 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
a360: 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20  ocessId(), i,.  
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
a380: 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
a390: 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
a3a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69        if( p->hFi
a3b0: 6c 65 2e 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f  le.h != INVALID_
a3c0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
a3d0: 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
a3e0: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
a3f0: 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f  ;.        winClo
a400: 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  se((sqlite3_file
a410: 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20   *)&p->hFile);. 
a420: 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
a430: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
a440: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a450: 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b  f( deleteFlag ){
a460: 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
a470: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
a480: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
a490: 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
a4a0: 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
a4b0: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
a4c0: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
a4d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
a4e0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
a4f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a500: 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20  p->aRegion);.   
a510: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a520: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
a530: 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e       pp = &p->pN
a540: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
a550: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
a560: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
a570: 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
a580: 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ith database fil
a590: 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57  e pDbFd..**.** W
a5a0: 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
a5b0: 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
a5c0: 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
a5d0: 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
a5e0: 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
a5f0: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
a600: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
a610: 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
a620: 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
a630: 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
a640: 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
a650: 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
a660: 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
a670: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
a680: 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64  nt winOpenShared
a690: 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a  Memory(winFile *
a6a0: 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
a6b0: 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6d0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
a6e0: 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
a6f0: 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
a700: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de *pShmNode = 0
a710: 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
a720: 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
a730: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a760: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73  sult code */.  s
a770: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
a780: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
a790: 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
a7a0: 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ated winShmNode 
a7b0: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a7e0: 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65  of zName in byte
a7f0: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
a800: 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
a810: 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76  ;    /* Not prev
a820: 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f  iously opened */
a830: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
a840: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
a850: 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62  w sqlite3_shm ob
a860: 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63  ject.  Also spec
a870: 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61  ulatively.  ** a
a880: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
a890: 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f  r a new winShmNo
a8a0: 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e  de and filename.
a8b0: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
a8c0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
a8d0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
a8e0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
a8f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
a900: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
a910: 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20  f(*p));.  nName 
a920: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a930: 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  0(pDbFd->zPath);
a940: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
a950: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
a960: 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e  (*pShmNode) + nN
a970: 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20 69 66  ame + 15 );.  if
a980: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
a990: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
a9a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
a9b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
a9c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
a9d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
a9e0: 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  .  pNew->zFilena
a9f0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
aa00: 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  w[1];.  sqlite3_
aa10: 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31  snprintf(nName+1
aa20: 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  5, pNew->zFilena
aa30: 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
aa40: 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  bFd->zPath);..  
aa50: 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  /* Look to see i
aa60: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78  f there is an ex
aa70: 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  isting winShmNod
aa80: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
aa90: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d  ed..  ** If no m
aaa0: 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  atching winShmNo
aab0: 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  de currently exi
aac0: 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65  sts, create a ne
aad0: 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69  w one..  */.  wi
aae0: 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
aaf0: 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65  ;.  for(pShmNode
ab00: 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
ab10: 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68  t; pShmNode; pSh
ab20: 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e  mNode=pShmNode->
ab30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54  pNext){.    /* T
ab40: 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20  BD need to come 
ab50: 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d  up with better m
ab60: 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68  atch here.  Perh
ab70: 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46  aps.    ** use F
ab80: 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f  ILE_ID_BOTH_DIR_
ab90: 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a  INFO Structure..
aba0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
abb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53  qlite3StrICmp(pS
abc0: 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
abd0: 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  e, pNew->zFilena
abe0: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
abf0: 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f    }.  if( pShmNo
ac00: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
ac10: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
ac20: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e  }else{.    pShmN
ac30: 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ode = pNew;.    
ac40: 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28  pNew = 0;.    ((
ac50: 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e  winFile*)(&pShmN
ac60: 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20  ode->hFile))->h 
ac70: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
ac80: 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d  _VALUE;.    pShm
ac90: 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69  Node->pNext = wi
aca0: 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
acb0: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74    winShmNodeList
acc0: 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20   = pShmNode;..  
acd0: 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65    pShmNode->mute
ace0: 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
acf0: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
ad00: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
ad10: 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  if( pShmNode->mu
ad20: 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
ad30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
ad40: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
ad50: 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
ad60: 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
ad70: 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
ad80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ad90: 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
ada0: 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
adb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
adc0: 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
add0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
ade0: 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
adf0: 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
ae00: 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
ae10: 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
ae30: 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
ae40: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
ae50: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
ae60: 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f  EN_CREATE, /* Mo
ae70: 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20  de flags */.    
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
ae90: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
aea0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
aeb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
aec0: 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
aed0: 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
aee0: 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rr;.    }..    /
aef0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
af00: 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
af10: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
af20: 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
af30: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  ..    ** If not,
af40: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
af50: 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
af60: 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  h. .    */.    i
af70: 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
af80: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
af90: 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
afa0: 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
afb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
afc0: 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
afd0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
afe0: 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
aff0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
b000: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b010: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
b020: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
b030: 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  N;.      }.    }
b040: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b050: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b060: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
b070: 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
b080: 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
b090: 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63  MS, 1);.      rc
b0a0: 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
b0b0: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
b0c0: 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_RDLCK, WIN_SH
b0d0: 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d  M_DMS, 1);.    }
b0e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
b0f0: 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
b100: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
b110: 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
b120: 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
b130: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
b140: 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
b150: 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
b160: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
b170: 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
b180: 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
b190: 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
b1a0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
b1b0: 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77  d->pShm = p;.  w
b1c0: 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
b1d0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
b1e0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
b1f0: 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
b200: 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
b210: 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
b220: 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
b230: 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  e winShmEnterMut
b240: 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74  ex() mutex and t
b250: 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  he pointer from 
b260: 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74  the.  ** new (st
b270: 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a  ruct winShm) obj
b280: 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
b290: 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
b2a0: 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
b2b0: 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
b2c0: 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
b2d0: 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
b2e0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
b2f0: 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
b300: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
b310: 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
b320: 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
b330: 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
b340: 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
b350: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
b360: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
b370: 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
b380: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
b390: 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
b3a0: 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
b3b0: 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
b3c0: 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
b3d0: 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
b3e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b3f0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
b400: 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
b410: 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
b420: 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
b430: 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
b440: 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
b450: 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68  DMS, 1);.  winSh
b460: 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
b470: 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20  fs, 0);      /* 
b480: 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
b490: 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
b4a0: 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
b4b0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
b4c0: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
b4d0: 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
b4e0: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
b4f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
b500: 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
b510: 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
b520: 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
b530: 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f  derlying .** sto
b540: 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
b550: 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ag is true..*/.s
b560: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
b570: 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
b580: 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
b590: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
b5a0: 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
b5b0: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64  emory */.  int d
b5c0: 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
b5d0: 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
b5e0: 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66  after closing if
b5f0: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69   true */.){.  wi
b600: 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  nFile *pDbFd;   
b610: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
b620: 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d  holding shared-m
b630: 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
b640: 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
b650: 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
b660: 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
b670: 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
b680: 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68  *pShmNode; /* Th
b690: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
b6a0: 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
b6b0: 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70  */.  winShm **pp
b6c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
b6d0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
b6e0: 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
b6f0: 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  ns */..  pDbFd =
b700: 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
b710: 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
b720: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
b730: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b740: 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
b750: 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a  >pShmNode;..  /*
b760: 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
b770: 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
b780: 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
b790: 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
b7a0: 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
b7b0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
b7c0: 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
b7d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
b7e0: 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
b7f0: 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
b800: 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
b810: 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
b820: 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
b830: 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
b840: 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
b850: 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
b860: 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
b870: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
b880: 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
b890: 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
b8a0: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
b8b0: 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
b8c0: 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
b8d0: 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
b8e0: 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
b8f0: 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  oo */.  winShmEn
b900: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
b910: 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
b920: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
b930: 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
b940: 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
b950: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  ef==0 ){.    win
b960: 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
b970: 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67  pVfs, deleteFlag
b980: 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c  );.  }.  winShmL
b990: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
b9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
b9c0: 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
b9d0: 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
b9e0: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f  mory segment..*/
b9f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
ba00: 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
ba10: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
ba20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
ba30: 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
ba40: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
ba50: 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
ba80: 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
ba90: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bac0: 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
bad0: 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
bae0: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb00: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
bb10: 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
bb20: 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
bb30: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
bb40: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
bb50: 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
bb60: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
bb70: 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
bb80: 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
bb90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
bba0: 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
bbb0: 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e   locked */.  win
bbc0: 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
bbf0: 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
bc00: 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  ngs */.  winShmN
bc10: 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
bc20: 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  p->pShmNode;.  i
bc30: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
bc40: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
bc50: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
bc60: 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
bc70: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc90: 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
bca0: 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
bcb0: 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
bcc0: 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
bcd0: 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
bce0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
bcf0: 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
bd00: 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
bd10: 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
bd20: 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
bd30: 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
bd40: 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
bd50: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
bd60: 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
bd70: 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
bd80: 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
bd90: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
bda0: 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
bdb0: 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
bdc0: 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
bdd0: 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
bde0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
bdf0: 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
be00: 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
be10: 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  VE)!=0 );..  mas
be20: 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28  k = (u16)((1U<<(
be30: 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c  ofst+n)) - (1U<<
be40: 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74  ofst));.  assert
be50: 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
be60: 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
be70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
be80: 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
be90: 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
bea0: 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
beb0: 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
bec0: 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
bed0: 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
bee0: 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
bef0: 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
bf00: 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
bf10: 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
bf20: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
bf30: 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
bf40: 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
bf50: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
bf60: 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
bf70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
bf80: 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
bf90: 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
bfa0: 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
bfb0: 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
bfc0: 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
bfd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bfe0: 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
bff0: 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
c000: 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
c010: 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
c020: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
c030: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
c040: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
c050: 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
c060: 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ASE, n);.    }el
c070: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
c080: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
c090: 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65  .    /* Undo the
c0a0: 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a   local locks */.
c0b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c0c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
c0d0: 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
c0e0: 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ask;.      p->sh
c0f0: 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
c100: 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73  k;.    } .  }els
c110: 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
c120: 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20  LITE_SHM_SHARED 
c130: 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68  ){.    u16 allSh
c140: 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e  ared = 0;  /* Un
c150: 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ion of locks hel
c160: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
c170: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20   other than "p" 
c180: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20  */..    /* Find 
c190: 6f 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64  out which shared
c1a0: 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61   locks are alrea
c1b0: 64 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  dy held by sibli
c1c0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a  ng connections..
c1d0: 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69      ** If any si
c1e0: 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f  bling already ho
c1f0: 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
c200: 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20   lock, go ahead 
c210: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
c220: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  * SQLITE_BUSY.. 
c230: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
c240: 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
c250: 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
c260: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
c270: 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
c280: 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
c290: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c2a0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
c2b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c2c0: 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20     allShared |= 
c2d0: 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
c2e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
c2f0: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  t shared locks a
c300: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
c310: 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  el, if necessary
c320: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c330: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c340: 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65     if( (allShare
c350: 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a  d & mask)==0 ){.
c360: 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
c370: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
c380: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c  hmNode, _SHM_RDL
c390: 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
c3a0: 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
c3b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c3c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
c3e0: 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
c3f0: 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
c400: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c410: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c420: 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
c430: 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
c440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
c450: 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
c460: 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
c470: 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
c480: 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
c490: 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
c4a0: 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
c4b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
c4c0: 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
c4d0: 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
c4e0: 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
c4f0: 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
c500: 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
c510: 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
c520: 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
c530: 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
c540: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c550: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
c560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c570: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
c580: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
c590: 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
c5a0: 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
c5b0: 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
c5c0: 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
c5d0: 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
c5e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
c5f0: 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
c600: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c610: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c620: 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
c630: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
c640: 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f  e, _SHM_WRLCK, o
c650: 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
c660: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
c670: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c680: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c690: 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
c6a0: 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
c6b0: 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
c6c0: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
c6d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
c6e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c6f0: 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
c700: 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
c710: 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
c720: 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
c730: 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a  03x,%03x %s\n",.
c740: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64             p->id
c750: 2c 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e  , (int)GetCurren
c760: 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
c770: 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
c780: 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
c790: 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65       rc ? "faile
c7a0: 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
c7b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c7c0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
c7d0: 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
c7e0: 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
c7f0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
c800: 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
c810: 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
c820: 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
c830: 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
c840: 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
c850: 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
c860: 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
c870: 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
c880: 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
c890: 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
c8a0: 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
c8b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
c8c0: 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
c8d0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
c8e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
c8f0: 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f  R(fd);.  /* Memo
c900: 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20  ryBarrier(); // 
c910: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d  does not work --
c920: 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79   do not know why
c930: 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   not */.  winShm
c940: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
c950: 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
c960: 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ();.}../*.** Thi
c970: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
c980: 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
c990: 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
c9a0: 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
c9b0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
c9c0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
c9d0: 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
c9e0: 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
c9f0: 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
ca00: 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
ca10: 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
ca20: 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
ca30: 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
ca40: 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
ca50: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
ca60: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
ca70: 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
ca80: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
ca90: 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
caa0: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
cab0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
cac0: 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
cad0: 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
cae0: 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
caf0: 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
cb00: 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
cb10: 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
cb20: 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
cb30: 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
cb40: 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
cb50: 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
cb60: 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
cb70: 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
cb80: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
cb90: 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  * isWrite is non
cba0: 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
cbb0: 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
cbc0: 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
cbd0: 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
cbe0: 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
cbf0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
cc00: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
cc10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
cc20: 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
cc30: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
cc40: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
cc50: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
cc60: 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
cc70: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
cc80: 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
cc90: 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
cca0: 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
ccb0: 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
ccc0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
ccd0: 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
cce0: 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
ccf0: 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
cd00: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
cd10: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
cd20: 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20  nt winShmMap(.  
cd30: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
cd40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cd50: 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
cd60: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
cd70: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
cd80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cd90: 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
cda0: 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
cdb0: 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
cde0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72  ns */.  int isWr
cdf0: 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
ce00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
ce10: 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
ce20: 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
ce30: 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
ce40: 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
ce50: 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
ce60: 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77  memory */.){.  w
ce70: 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
ce80: 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
ce90: 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
cea0: 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68  d->pShm;.  winSh
ceb0: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
cec0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ced0: 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
cee0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
cef0: 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
cf00: 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
cf10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cf20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cf30: 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
cf40: 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20  .  }.  pShmNode 
cf50: 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
cf60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cf70: 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
cf80: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
cf90: 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
cfa0: 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
cfb0: 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
cfc0: 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
cfd0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
cfe0: 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
cff0: 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
d000: 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
d010: 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
d020: 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
d030: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
d040: 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
d050: 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
d060: 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
d070: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
d080: 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d0a0: 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
d0b0: 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
d0c0: 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
d0d0: 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
d0e0: 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
d0f0: 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
d100: 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
d110: 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
d120: 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
d130: 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
d140: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
d150: 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
d160: 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
d170: 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
d180: 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
d190: 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
d1a0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
d1b0: 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
d1c0: 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
d1d0: 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
d1e0: 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
d1f0: 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
d200: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d210: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
d220: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
d230: 53 49 5a 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f  SIZE;.      goto
d240: 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
d250: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
d260: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
d270: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
d280: 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
d290: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
d2a0: 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
d2b0: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
d2c0: 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
d2d0: 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
d2e0: 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
d2f0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
d300: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
d310: 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
d320: 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
d330: 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
d340: 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
d350: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
d360: 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
d370: 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
d380: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
d390: 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
d3a0: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
d3b0: 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
d3c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
d3d0: 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
d3e0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
d3f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d400: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
d410: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  = SQLITE_IOERR_S
d420: 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  HMSIZE;.        
d430: 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
d440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d450: 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
d460: 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
d470: 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
d480: 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
d490: 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
d4a0: 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
d4b0: 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
d4c0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
d4d0: 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
d4e0: 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
d4f0: 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
d500: 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
d510: 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
d520: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d530: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
d540: 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
d550: 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
d560: 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
d570: 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
d580: 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
d590: 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
d5a0: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
d5b0: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
d5c0: 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
d5d0: 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
d5e0: 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
d5f0: 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
d600: 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
d610: 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  mory region */. 
d620: 20 20 20 20 0a 20 20 20 20 20 20 68 4d 61 70 20      .      hMap 
d630: 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  = CreateFileMapp
d640: 69 6e 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ing(pShmNode->hF
d650: 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
d660: 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
d670: 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
d680: 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
d690: 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
d6a0: 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63  SHM-MAP pid-%d c
d6b0: 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20  reate region=%d 
d6c0: 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a  nbyte=%d %s\n",.
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d6e0: 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
d6f0: 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
d700: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42  ode->nRegion, nB
d710: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
d720: 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20      hMap ? "ok" 
d730: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
d740: 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a      if( hMap ){.
d750: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
d760: 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  set = pShmNode->
d770: 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
d780: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
d790: 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
d7a0: 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
d7b0: 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
d7c0: 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 20  anularity;.     
d7d0: 20 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69 65     pMap = MapVie
d7e0: 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49  wOfFile(hMap, FI
d7f0: 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
d800: 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
d810: 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66            0, iOf
d820: 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
d830: 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
d840: 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
d850: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
d860: 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
d870: 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67  P pid-%d map reg
d880: 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64  ion=%d offset=%d
d890: 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   size=%d %s\n",.
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74   (int)GetCurrent
d8c0: 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
d8d0: 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
d8e0: 69 4f 66 66 73 65 74 2c 20 73 7a 52 65 67 69 6f  iOffset, szRegio
d8f0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d900: 20 20 20 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20      pMap ? "ok" 
d910: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
d920: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d930: 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  !pMap ){.       
d940: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
d950: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
d960: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
d970: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
d980: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
d990: 61 70 20 29 20 43 6c 6f 73 65 48 61 6e 64 6c 65  ap ) CloseHandle
d9a0: 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
d9b0: 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
d9c0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
d9d0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
d9e0: 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
d9f0: 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
da00: 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
da10: 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
da20: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
da30: 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
da40: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
da50: 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
da60: 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
da70: 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
da80: 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
da90: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
daa0: 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
dab0: 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
dac0: 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
dad0: 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
dae0: 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
daf0: 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
db00: 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
db10: 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
db20: 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
db30: 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
db40: 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
db50: 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
db60: 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
db70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
db80: 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
db90: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
dba0: 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
dbb0: 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
dbc0: 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
dbd0: 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
dbe0: 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
dbf0: 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
dc00: 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
dc10: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
dc20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
dc30: 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  AL */../*.** Her
dc40: 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
dc50: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
dc60: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
dc70: 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
dc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc90: 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
dca0: 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
dcb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
dcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
dd20: 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
dd30: 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
dd40: 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
dd50: 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
dd60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
dd70: 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
dd80: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
dd90: 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
dda0: 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20  ethod = {.  2,  
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
ddd0: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
dde0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de00: 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
de10: 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
de20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
de30: 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
de40: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
de50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
de60: 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
de70: 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
de80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
de90: 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
dea0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
deb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
dec0: 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
ded0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
dee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
def0: 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
df00: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
df10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
df20: 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
df30: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
df40: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
df50: 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
df60: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
df70: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
df80: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
df90: 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
dfa0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
dfb0: 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
dfc0: 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
dfd0: 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
dfe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
dff0: 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
e000: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
e010: 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
e020: 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
e030: 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
e040: 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
e050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
e060: 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
e070: 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
e080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
e090: 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
e0a0: 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e0c0: 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
e0d0: 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20   winShmUnmap    
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
e100: 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
e110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e150: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
e160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
e170: 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
e180: 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
e190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
e1b0: 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
e1c0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
e1d0: 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
e1e0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
e1f0: 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
e200: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
e210: 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
e220: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
e230: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
e240: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
e250: 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
e260: 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
e270: 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
e280: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
e290: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
e2a0: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
e2b0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
e2c0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
e2d0: 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72  tic void *conver
e2e0: 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  tUtf8Filename(co
e2f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
e300: 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
e310: 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
e320: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
e330: 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75    zConverted = u
e340: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
e350: 6c 65 6e 61 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54  lename);./* isNT
e360: 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
e370: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
e380: 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
e390: 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
e3a0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
e3b0: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
e3c0: 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
e3d0: 64 20 3d 20 75 74 66 38 54 6f 4d 62 63 73 28 7a  d = utf8ToMbcs(z
e3e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
e3f0: 66 0a 20 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65  f.  }.  /* calle
e400: 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
e410: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
e420: 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
e430: 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ed;.}../*.** Cre
e440: 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
e450: 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
e460: 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
e470: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a   big enough to.*
e480: 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e  * hold at pVfs->
e490: 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61  mxPathname chara
e4a0: 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
e4b0: 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
e4c0: 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
e4d0: 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
e4e0: 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
e4f0: 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
e500: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
e510: 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
e520: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
e530: 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
e540: 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c  89";.  size_t i,
e550: 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70   j;.  char zTemp
e560: 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  Path[MAX_PATH+1]
e570: 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
e580: 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
e590: 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
e5a0: 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
e5b0: 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
e5c0: 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
e5d0: 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
e5e0: 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
e5f0: 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
e600: 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
e610: 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
e620: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
e630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
e640: 52 52 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  RR );..  if( sql
e650: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
e660: 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
e670: 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
e680: 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
e690: 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  th, "%s", sqlite
e6a0: 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
e6b0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
e6c0: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
e6d0: 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57  r *zMulti;.    W
e6e0: 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d  CHAR zWidePath[M
e6f0: 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65  AX_PATH];.    Ge
e700: 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50  tTempPathW(MAX_P
e710: 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74  ATH-30, zWidePat
e720: 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d  h);.    zMulti =
e730: 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
e740: 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
e750: 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
e760: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
e770: 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
e780: 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
e790: 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
e7a0: 20 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20   free(zMulti);. 
e7b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e7c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e7d0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73  MEM;.    }./* is
e7e0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
e7f0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
e800: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
e810: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
e820: 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
e830: 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
e840: 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
e850: 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
e860: 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
e870: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
e880: 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
e890: 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
e8a0: 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
e8b0: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
e8c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
e8d0: 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
e8e0: 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50   zMbcsPath[MAX_P
e8f0: 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d  ATH];.    GetTem
e900: 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d  pPathA(MAX_PATH-
e910: 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a  30, zMbcsPath);.
e920: 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
e930: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
e940: 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
e950: 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
e960: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e970: 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
e980: 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
e990: 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  h, "%s", zUtf8);
e9a0: 0a 20 20 20 20 20 20 66 72 65 65 28 7a 55 74 66  .      free(zUtf
e9b0: 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
e9c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e9d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
e9e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
e9f0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
ea00: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
ea10: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
ea20: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
ea30: 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
ea40: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
ea50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
ea60: 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
ea70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ea80: 7a 54 65 6d 70 50 61 74 68 29 20 2b 20 73 71 6c  zTempPath) + sql
ea90: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c  ite3Strlen30(SQL
eaa0: 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
eab0: 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 6e  EFIX) + 17) >= n
eac0: 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
ead0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
eae0: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c    }..  for(i=sql
eaf0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
eb00: 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20  mpPath); i>0 && 
eb10: 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d  zTempPath[i-1]==
eb20: 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  '\\'; i--){}.  z
eb30: 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b  TempPath[i] = 0;
eb40: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
eb50: 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42  intf(nBuf-17, zB
eb60: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  uf,.            
eb70: 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c         "%s\\"SQL
eb80: 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
eb90: 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29  EFIX, zTempPath)
eba0: 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53  ;.  j = sqlite3S
ebb0: 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
ebc0: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
ebd0: 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
ebe0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
ebf0: 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
ec00: 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
ec10: 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
ec20: 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
ec30: 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
ec40: 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20  rs)-1) ];.  }.  
ec50: 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 0a 20 20  zBuf[j] = 0;..  
ec60: 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 20 46  OSTRACE(("TEMP F
ec70: 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20  ILENAME: %s\n", 
ec80: 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
ec90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
eca0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
ecb0: 20 76 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73   value of getLas
ecc0: 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20  tErrorMsg.** is 
ecd0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
ece0: 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
ecf0: 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
ed00: 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
ed10: 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
ed20: 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
ed30: 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ated)..*/.static
ed40: 20 69 6e 74 20 67 65 74 4c 61 73 74 45 72 72 6f   int getLastErro
ed50: 72 4d 73 67 28 69 6e 74 20 6e 42 75 66 2c 20 63  rMsg(int nBuf, c
ed60: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
ed70: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72   FormatMessage r
ed80: 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c  eturns 0 on fail
ed90: 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ure.  Otherwise 
eda0: 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  it.  ** returns 
edb0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43  the number of TC
edc0: 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20  HARs written to 
edd0: 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20  the output.  ** 
ede0: 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e  buffer, excludin
edf0: 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e  g the terminatin
ee00: 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a  g null char..  *
ee10: 2f 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20  /.  DWORD error 
ee20: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
ee30: 3b 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20  ;.  DWORD dwLen 
ee40: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  = 0;.  char *zOu
ee50: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 73  t = 0;..  if( is
ee60: 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41  NT() ){.    WCHA
ee70: 52 20 2a 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e  R *zTempWide = N
ee80: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
ee90: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28   FormatMessageW(
eea0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
eeb0: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
eec0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
eed0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f  FROM_SYSTEM | FO
eee0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
eef0: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a           error,.
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52           (LPWSTR
ef80: 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20  ) &zTempWide,.  
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
efd0: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
efe0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
eff0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
f000: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
f010: 2f 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75  /.      zOut = u
f020: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
f030: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 2f  mpWide);.      /
f040: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
f050: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
f060: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
f070: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 4c 6f 63  age */.      Loc
f080: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65  alFree(zTempWide
f090: 29 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73 4e 54  );.    }./* isNT
f0a0: 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
f0b0: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
f0c0: 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
f0d0: 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
f0e0: 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43  ** Since the ASC
f0f0: 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  II version of th
f100: 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
f110: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
f120: 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
f130: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
f140: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
f150: 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
f160: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
f170: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
f180: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
f190: 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Temp = NULL;.   
f1a0: 20 64 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d   dwLen = FormatM
f1b0: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
f1c0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
f1d0: 42 55 46 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f  BUFFER | FORMAT_
f1e0: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
f1f0: 54 45 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53  TEM | FORMAT_MES
f200: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
f210: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f250: 20 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20   error,.        
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c   (LPSTR) &zTemp,
f2a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
f2e0: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
f2f0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
f300: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
f310: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
f320: 38 20 2a 2f 0a 20 20 20 20 20 20 7a 4f 75 74 20  8 */.      zOut 
f330: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
f340: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
f350: 6d 70 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  mp);.      /* fr
f360: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
f370: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
f380: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
f390: 2a 2f 0a 20 20 20 20 20 20 4c 6f 63 61 6c 46 72  */.      LocalFr
f3a0: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d  ee(zTemp);.    }
f3b0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
f3c0: 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a  ( 0 == dwLen ){.
f3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
f3e0: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
f3f0: 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 20 28   "OsError 0x%x (
f400: 25 75 29 22 2c 20 65 72 72 6f 72 2c 20 65 72 72  %u)", error, err
f410: 6f 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  or);.  }else{.  
f420: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
f430: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
f440: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
f450: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
f460: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
f470: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
f480: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
f490: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
f4a0: 2a 2f 0a 20 20 20 20 66 72 65 65 28 7a 4f 75 74  */.    free(zOut
f4b0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f4c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  0;.}../*.** Open
f4d0: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
f4e0: 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a  ic int winOpen(.
f4f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
f500: 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  Vfs,        /* N
f510: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
f520: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
f530: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
f540: 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
f550: 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
f560: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
f570: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
f580: 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
f590: 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
f5a0: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
f5b0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
f5c0: 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
f5d0: 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
f5e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
f5f0: 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
f600: 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
f610: 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
f620: 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
f630: 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
f640: 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
f650: 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
f660: 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
f670: 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
f680: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
f690: 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
f6a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
f6b0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
f6c0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
f6d0: 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
f6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
f6f0: 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
f700: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
f710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
f720: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
f730: 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
f740: 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a  -8 encoding */..
f750: 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
f760: 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
f770: 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
f780: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
f790: 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
f7a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
f7b0: 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
f7c0: 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
f7d0: 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
f7e0: 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
f7f0: 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20  me[MAX_PATH+1]; 
f800: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
f810: 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d  ed to create tem
f820: 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20  p filename */.. 
f830: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f840: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
f850: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
f860: 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21  rn Code */.#if !
f870: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
f880: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
f890: 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d  CE.  int eType =
f8a0: 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30   flags&0xFFFFFF0
f8b0: 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66  0;  /* Type of f
f8c0: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23  ile to open */.#
f8d0: 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45  endif..  int isE
f8e0: 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61  xclusive  = (fla
f8f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
f900: 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69  _EXCLUSIVE);.  i
f910: 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20  nt isDelete     
f920: 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
f930: 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
f940: 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43  LOSE);.  int isC
f950: 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61  reate     = (fla
f960: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
f970: 5f 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65  _CREATE);.#ifnde
f980: 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
f990: 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66  sReadonly   = (f
f9a0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
f9b0: 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65  EN_READONLY);.#e
f9c0: 6e 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61  ndif.  int isRea
f9d0: 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
f9e0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
f9f0: 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
fa00: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
fa10: 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
fa20: 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
fa30: 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
fa40: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
fa50: 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
fa60: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
fa70: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
fa80: 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
fa90: 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
faa0: 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a  AL.  ));.#endif.
fab0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
fac0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
fad0: 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
fae0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
faf0: 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
fb00: 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
fb10: 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
fb20: 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
fb30: 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
fb40: 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
fb50: 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
fb60: 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
fb70: 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
fb80: 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
fb90: 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
fba0: 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
fbb0: 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
fbc0: 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
fbd0: 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
fbe0: 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
fbf0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
fc00: 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
fc10: 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
fc20: 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
fc30: 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
fc40: 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
fc50: 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
fc60: 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
fc70: 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
fc80: 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
fc90: 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
fca0: 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
fcb0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
fcc0: 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
fcd0: 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
fce0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
fcf0: 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
fd00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
fd10: 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
fd20: 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
fd30: 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
fd40: 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
fd50: 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
fd60: 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
fd70: 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
fd80: 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
fd90: 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
fda0: 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
fdb0: 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
fdc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
fdd0: 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
fde0: 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
fdf0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
fe00: 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
fe10: 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
fe20: 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
fe30: 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
fe40: 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
fe50: 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
fe60: 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
fe70: 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
fe80: 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
fe90: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
fea0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
feb0: 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
fec0: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
fed0: 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
fee0: 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
fef0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
ff00: 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
ff10: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
ff20: 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
ff30: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
ff40: 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
ff50: 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
ff60: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
ff70: 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
ff80: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
ff90: 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
ffa0: 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
ffb0: 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
ffc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
ffd0: 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
ffe0: 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
fff0: 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e  .  pFile->h = IN
10000 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
10010 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  UE;..  /* If the
10020 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10030 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
10040 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72  n is NULL, gener
10050 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70  ate a .  ** temp
10060 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
10070 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69  to use .  */.  i
10080 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b  f( !zUtf8Name ){
10090 0a 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65  .    assert(isDe
100a0 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a  lete && !isOpenJ
100b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20  ournal);.    rc 
100c0 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  = getTempname(MA
100d0 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e 61  X_PATH+1, zTmpna
100e0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
100f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10110 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
10120 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
10130 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74   }..  /* Convert
10140 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f   the filename to
10150 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f   the system enco
10160 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76  ding. */.  zConv
10170 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
10180 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66  tf8Filename(zUtf
10190 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  8Name);.  if( zC
101a0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
101b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
101c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69  _NOMEM;.  }..  i
101d0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
101e0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
101f0 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
10200 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
10210 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
10220 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
10230 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
10240 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c  D;.  }..  /* SQL
10250 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
10260 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  VE is used to ma
10270 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e  ke sure that a n
10280 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  ew file is .  **
10290 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65   created. SQLite
102a0 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20   doesn't use it 
102b0 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78 63  to indicate "exc
102c0 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 20 0a  lusive access" .
102d0 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73    ** as it is us
102e0 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64  ually understood
102f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
10300 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
10310 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77  /* Creates a new
10320 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
10330 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
10340 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  dy exist. */.   
10350 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
10360 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73  exists, it fails
10370 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
10380 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
10390 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d   CREATE_NEW;.  }
103a0 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74  else if( isCreat
103b0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
103c0 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20   existing file, 
103d0 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20  or create if it 
103e0 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f  doesn't exist */
103f0 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
10400 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
10410 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
10420 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20  e{.    /* Opens 
10430 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  a file, only if 
10440 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  it exists. */.  
10450 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
10460 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45  osition = OPEN_E
10470 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20  XISTING;.  }..  
10480 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49  dwShareMode = FI
10490 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
104a0 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
104b0 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  ;..  if( isDelet
104c0 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  e ){.#if SQLITE_
104d0 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46  OS_WINCE.    dwF
104e0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
104f0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
10500 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69  TE_HIDDEN;.    i
10510 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65  sTemp = 1;.#else
10520 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
10530 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
10540 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f  _ATTRIBUTE_TEMPO
10550 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  RARY.           
10560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10570 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49      | FILE_ATTRI
10580 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20  BUTE_HIDDEN.    
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
105b0 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
105c0 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20  _CLOSE;.#endif. 
105d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
105e0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
105f0 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
10600 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
10610 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20  /* Reports from 
10620 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65  the internet are
10630 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63   that performanc
10640 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a  e is always.  **
10650 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f   better if FILE_
10660 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
10670 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63  SS is used.  Tic
10680 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69  ket #2699. */.#i
10690 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
106a0 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74  E.  dwFlagsAndAt
106b0 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45  tributes |= FILE
106c0 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
106d0 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ESS;.#endif..  i
106e0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
106f0 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57   h = CreateFileW
10700 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
10710 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65  ted,.       dwDe
10720 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
10730 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
10740 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
10750 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
10760 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
10770 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
10780 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
10790 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a 20 69  NULL.    );./* i
107a0 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
107b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
107c0 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
107d0 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
107e0 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
107f0 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66  ASCII version of
10800 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
10810 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
10820 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
10830 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
10840 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
10850 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
10860 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
10870 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
10880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20   }else{.    h = 
10890 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61  CreateFileA((cha
108a0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  r*)zConverted,. 
108b0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
108c0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
108d0 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
108e0 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
108f0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
10900 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
10910 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
10920 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
10930 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d     );.#endif.  }
10940 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
10950 45 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25  EN %d %s 0x%lx %
10960 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
10970 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65    h, zName, dwDe
10980 73 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20  siredAccess, .  
10990 20 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41           h==INVA
109a0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
109b0 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
109c0 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d  k"));..  if( h==
109d0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
109e0 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c  ALUE ){.    pFil
109f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
10a00 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
10a10 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
10a20 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52  ed);.    if( isR
10a30 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
10a40 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e    return winOpen
10a50 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64  (pVfs, zName, id
10a60 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
10a70 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
10a80 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28  PEN_READONLY)&~(
10a90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
10aa0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
10ab0 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74  EADWRITE)), pOut
10ac0 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
10ad0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
10ae0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
10af0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
10b00 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
10b10 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
10b20 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
10b30 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
10b40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
10b50 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
10b60 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
10b70 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
10b80 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
10b90 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   }..  memset(pFi
10ba0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
10bb0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
10bc0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
10bd0 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
10be0 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65  ->h = h;.  pFile
10bf0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
10c00 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
10c10 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
10c20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b  pFile->pShm = 0;
10c30 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
10c40 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c 65  = zName;.  pFile
10c50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 67  ->sectorSize = g
10c60 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 56 66  etSectorSize(pVf
10c70 73 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 0a  s, zUtf8Name);..
10c80 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
10c90 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64  NCE.  if( isRead
10ca0 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
10cb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
10cc0 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 21 77  _DB.       && !w
10cd0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a  inceCreateLock(z
10ce0 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29  Name, pFile).  )
10cf0 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c  {.    CloseHandl
10d00 65 28 68 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  e(h);.    free(z
10d10 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
10d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
10d30 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d  NTOPEN_BKPT;.  }
10d40 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
10d50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
10d60 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
10d70 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
10d80 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
10d90 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
10da0 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75  ;.  }..  OpenCou
10db0 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
10dc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10dd0 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
10de0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   file..**.** Not
10df0 65 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64  e that windows d
10e00 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
10e10 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
10e20 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
10e30 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20  .** process has 
10e40 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69  it open.  Someti
10e50 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e  mes a virus scan
10e60 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20  ner or indexing 
10e70 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20  program.** will 
10e80 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
10e90 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65  ile shortly afte
10ea0 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  r it is created 
10eb0 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a  in order to do.*
10ec0 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f  * whatever it do
10ed0 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20  es.  While this 
10ee0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
10ef0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20   holding the.** 
10f00 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69  file open, we wi
10f10 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ll be unable to 
10f20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77  delete it.  To w
10f30 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a  ork around this.
10f40 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ** problem, we d
10f50 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65  elay 100 millise
10f60 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f  conds and try to
10f70 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20   delete again.  
10f80 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45  Up.** to MX_DELE
10f90 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65  TION_ATTEMPTs de
10fa0 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  letion attempts 
10fb0 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67  are run before g
10fc0 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20  iving.** up and 
10fd0 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
10fe0 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
10ff0 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
11000 50 54 53 20 35 0a 73 74 61 74 69 63 20 69 6e 74  PTS 5.static int
11010 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
11020 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
11030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
11040 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
11050 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11060 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
11070 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
11080 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
11090 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
110a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
110b0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
110c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
110d0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b  = 0;.  DWORD rc;
110e0 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d  .  DWORD error =
110f0 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
11100 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
11110 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
11120 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
11130 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a  ETER(syncDir);..
11140 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11150 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
11160 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
11170 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
11180 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
11190 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
111a0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
111b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
111c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
111d0 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
111e0 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  {.    do{.      
111f0 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
11200 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68  verted);.    }wh
11210 69 6c 65 28 20 20 20 28 20 20 20 28 28 72 63 20  ile(   (   ((rc 
11220 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
11230 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
11240 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  ) != INVALID_FIL
11250 45 5f 41 54 54 52 49 42 55 54 45 53 29 0a 20 20  E_ATTRIBUTES).  
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11270 28 28 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73  ((error = GetLas
11280 74 45 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52  tError()) == ERR
11290 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
112a0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  )).           &&
112b0 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c   (++cnt < MX_DEL
112c0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a  ETION_ATTEMPTS).
112d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 53             && (S
112e0 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
112f0 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
11300 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
11310 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
11320 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
11330 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
11340 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
11350 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
11360 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
11370 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
11380 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
11390 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
113a0 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
113b0 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
113c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
113d0 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
113e0 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65 74   do{.      Delet
113f0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
11400 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  d);.    }while( 
11410 20 20 28 20 20 20 28 28 72 63 20 3d 20 47 65 74    (   ((rc = Get
11420 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
11430 7a 43 6f 6e 76 65 72 74 65 64 29 29 20 21 3d 20  zConverted)) != 
11440 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
11450 52 49 42 55 54 45 53 29 0a 20 20 20 20 20 20 20  RIBUTES).       
11460 20 20 20 20 20 20 20 20 7c 7c 20 28 28 65 72 72          || ((err
11470 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
11480 72 28 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41 43  r()) == ERROR_AC
11490 43 45 53 53 5f 44 45 4e 49 45 44 29 29 0a 20 20  CESS_DENIED)).  
114a0 20 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b 63           && (++c
114b0 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  nt < MX_DELETION
114c0 5f 41 54 54 45 4d 50 54 53 29 0a 20 20 20 20 20  _ATTEMPTS).     
114d0 20 20 20 20 20 20 26 26 20 28 53 6c 65 65 70 28        && (Sleep(
114e0 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64  100), 1) );.#end
114f0 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43  if.  }.  free(zC
11500 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54  onverted);.  OST
11510 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22  RACE(("DELETE \"
11520 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c  %s\" %s\n", zFil
11530 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 28 20  ename,.       ( 
11540 28 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  (rc==INVALID_FIL
11550 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
11560 20 28 65 72 72 6f 72 3d 3d 45 52 52 4f 52 5f 46   (error==ERROR_F
11570 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20  ILE_NOT_FOUND)) 
11580 3f 0a 20 20 20 20 20 20 20 20 20 22 6f 6b 22 20  ?.         "ok" 
11590 3a 20 22 66 61 69 6c 65 64 22 20 29 29 3b 0a 20  : "failed" ));. 
115a0 0a 20 20 72 65 74 75 72 6e 20 28 20 20 20 28 72  .  return (   (r
115b0 63 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  c == INVALID_FIL
115c0 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 0a 20  E_ATTRIBUTES) . 
115d0 20 20 20 20 20 20 20 20 20 26 26 20 28 65 72 72           && (err
115e0 6f 72 20 3d 3d 20 45 52 52 4f 52 5f 46 49 4c 45  or == ERROR_FILE
115f0 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 20 53  _NOT_FOUND)) ? S
11600 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
11610 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a  E_IOERR_DELETE;.
11620 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
11630 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64  he existance and
11640 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
11650 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11660 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
11670 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
11690 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
116a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
116b0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
116c0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
116d0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
116e0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
116f0 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
11700 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
11710 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
11720 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11740 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b  UT: Result */.){
11750 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
11760 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 76   int rc = 0;.  v
11770 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
11780 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11790 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69  TER(pVfs);..  Si
117a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
117b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
117c0 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
117d0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
117e0 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
117f0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
11800 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
11810 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11820 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11830 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
11840 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
11850 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
11860 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
11870 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
11880 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
11890 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20  Data));.    if( 
118a0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
118b0 73 45 78 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  sExW((WCHAR*)zCo
118c0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
118f0 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20  nfoStandard, .  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
11920 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20  rData) ){.      
11930 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45  /* For an SQLITE
11940 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71  _ACCESS_EXISTS q
11950 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65  uery, treat a ze
11960 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20  ro-length file. 
11970 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74       ** as if it
11980 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
11990 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
119a0 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51  if(    flags==SQ
119b0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
119c0 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  TS.          && 
119d0 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
119e0 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20  izeHigh==0 .    
119f0 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
11a00 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d  ta.nFileSizeLow=
11a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  =0 ){.        at
11a20 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
11a30 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
11a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11a50 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
11a60 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
11a70 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  utes;.      }.  
11a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
11a90 66 28 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  f( GetLastError(
11aa0 29 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  )!=ERROR_FILE_NO
11ab0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
11ac0 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
11ad0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
11ae0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11af0 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d  _ACCESS;.      }
11b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
11b10 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
11b20 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
11b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69      }.    }./* i
11b40 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
11b50 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
11b60 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
11b70 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
11b80 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
11b90 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66  ASCII version of
11ba0 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
11bb0 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
11bc0 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
11bd0 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
11be0 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
11bf0 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
11c00 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
11c10 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
11c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72   }else{.    attr
11c30 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
11c40 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
11c50 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
11c60 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
11c70 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63  verted);.  switc
11c80 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
11c90 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
11ca0 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73  SS_READ:.    cas
11cb0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
11cc0 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63  EXISTS:.      rc
11cd0 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
11ce0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
11cf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11d00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
11d10 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
11d20 0a 20 20 20 20 20 20 72 63 20 3d 20 28 61 74 74  .      rc = (att
11d30 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
11d40 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
11d50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11d60 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
11d70 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
11d80 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
11d90 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
11da0 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  ut = rc;.  retur
11db0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11dc0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
11dd0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
11de0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
11df0 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
11e00 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
11e10 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
11e20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
11e30 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
11e40 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
11e50 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
11e60 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
11e70 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
11e80 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
11e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
11ea0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
11eb0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
11ec0 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
11ed0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
11ee0 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
11ef0 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
11f00 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
11f10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
11f20 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
11f30 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
11f40 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f60 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
11f70 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69  /.){.  .#if defi
11f80 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
11f90 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11fa0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11fb0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53  _ERROR );.  UNUS
11fc0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
11fd0 6c 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f  ll);.  cygwin_co
11fe0 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32  nv_to_full_win32
11ff0 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c  _path(zRelative,
12000 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72   zFull);.  retur
12010 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
12020 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
12030 4f 53 5f 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c  OS_WINCE.  Simul
12040 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12050 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
12060 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12070 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
12080 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
12090 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
120a0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
120b0 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
120c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   */.  sqlite3_sn
120d0 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50  printf(pVfs->mxP
120e0 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20  athname, zFull, 
120f0 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
12100 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12110 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
12120 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
12130 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  CE && !defined(_
12140 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74  _CYGWIN__).  int
12150 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a   nByte;.  void *
12160 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68  zConverted;.  ch
12170 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20  ar *zOut;..  /* 
12180 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
12190 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
121a0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
121b0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
121c0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
121d0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
121e0 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
121f0 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
12200 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
12210 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
12220 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
12230 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
12240 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
12250 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
12260 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
12270 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
12280 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
12290 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
122a0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
122b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
122c0 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65  nFull);.  zConve
122d0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
122e0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
122f0 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73 4e  tive);.  if( isN
12300 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52  T() ){.    WCHAR
12310 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
12320 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68  te = GetFullPath
12330 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43  NameW((WCHAR*)zC
12340 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
12350 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d  0) + 3;.    zTem
12360 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  p = malloc( nByt
12370 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
12380 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
12390 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
123a0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
123b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
123c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
123d0 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61   }.    GetFullPa
123e0 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29  thNameW((WCHAR*)
123f0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
12400 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
12410 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
12420 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75  d);.    zOut = u
12430 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
12440 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54  mp);.    free(zT
12450 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  emp);./* isNT() 
12460 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
12470 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
12480 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
12490 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
124a0 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
124b0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
124c0 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
124d0 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
124e0 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
124f0 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
12500 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
12510 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
12520 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
12530 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
12540 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
12550 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47  p;.    nByte = G
12560 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
12570 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
12580 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b  d, 0, 0, 0) + 3;
12590 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c  .    zTemp = mal
125a0 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
125b0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
125c0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
125d0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43  ){.      free(zC
125e0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
125f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12600 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
12610 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
12620 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
12630 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
12640 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 0);.    free(z
12650 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
12660 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
12670 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
12680 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
12690 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64 69  ee(zTemp);.#endi
126a0 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74  f.  }.  if( zOut
126b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
126c0 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
126d0 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  xPathname, zFull
126e0 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
126f0 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20     free(zOut);. 
12700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12710 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
12720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12730 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
12740 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74  f.}../*.** Get t
12750 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f  he sector size o
12760 66 20 74 68 65 20 64 65 76 69 63 65 20 75 73 65  f the device use
12770 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 66 69  d to store.** fi
12780 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12790 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28  t getSectorSize(
127a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
127b0 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e 73   *pVfs,.    cons
127c0 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
127d0 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 66  e     /* UTF-8 f
127e0 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  ile name */.){. 
127f0 20 44 57 4f 52 44 20 62 79 74 65 73 50 65 72 53   DWORD bytesPerS
12800 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
12810 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
12820 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44 69 73 6b  ZE;.  /* GetDisk
12830 46 72 65 65 53 70 61 63 65 20 69 73 20 6e 6f 74  FreeSpace is not
12840 20 73 75 70 70 6f 72 74 65 64 20 75 6e 64 65 72   supported under
12850 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66 20 53 51   WINCE */.#if SQ
12860 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12870 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12880 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
12890 5f 50 41 52 41 4d 45 54 45 52 28 7a 52 65 6c 61  _PARAMETER(zRela
128a0 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63  tive);.#else.  c
128b0 68 61 72 20 7a 46 75 6c 6c 70 61 74 68 5b 4d 41  har zFullpath[MA
128c0 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 6e 74  X_PATH+1];.  int
128d0 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 64 77 52   rc;.  DWORD dwR
128e0 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  et = 0;.  DWORD 
128f0 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a 20  dwDummy;..  /*. 
12900 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 67   ** We need to g
12910 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  et the full path
12920 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
12930 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74 20 74 68  e.  ** to get th
12940 65 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 74  e drive letter t
12950 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73 65  o look up the se
12960 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a  ctor.  ** size..
12970 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
12980 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
12990 0a 20 20 72 63 20 3d 20 77 69 6e 46 75 6c 6c 50  .  rc = winFullP
129a0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 52  athname(pVfs, zR
129b0 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50 41 54  elative, MAX_PAT
129c0 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20  H, zFullpath);. 
129d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
129e0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 69 66 28  Benign(0);.  if(
129f0 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc == SQLITE_OK
12a00 20 29 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64 20   ).  {.    void 
12a10 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
12a20 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
12a30 65 28 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20  e(zFullpath);.  
12a40 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
12a50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
12a60 4e 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NT() ){.        
12a70 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20  /* trim path to 
12a80 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72  just drive refer
12a90 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ence */.        
12aa0 57 43 48 41 52 20 2a 70 20 3d 20 7a 43 6f 6e 76  WCHAR *p = zConv
12ab0 65 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66  erted;.        f
12ac0 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20  or(;*p;p++){.   
12ad0 20 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d         if( *p ==
12ae0 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20   '\\' ){.       
12af0 20 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a       *p = '\0';.
12b00 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
12b10 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
12b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12b30 20 64 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b   dwRet = GetDisk
12b40 46 72 65 65 53 70 61 63 65 57 28 28 57 43 48 41  FreeSpaceW((WCHA
12b50 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b80 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20   &dwDummy,.     
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79               &by
12bb0 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20  tesPerSector,.  
12bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20  &dwDummy,.      
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
12c10 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ummy);.      }el
12c20 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74  se{.        /* t
12c30 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74  rim path to just
12c40 20 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65   drive reference
12c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
12c60 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 7a 43   *p = (char *)zC
12c70 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20  onverted;.      
12c80 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a    for(;*p;p++){.
12c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
12ca0 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20   == '\\' ){.    
12cb0 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30          *p = '\0
12cc0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ';.            b
12cd0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
12ce0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12cf0 20 20 20 20 64 77 52 65 74 20 3d 20 47 65 74 44      dwRet = GetD
12d00 69 73 6b 46 72 65 65 53 70 61 63 65 41 28 28 63  iskFreeSpaceA((c
12d10 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
12d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20     &dwDummy,.   
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
12d70 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a  bytesPerSector,.
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20    &dwDummy,.    
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
12dd0 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d  wDummy);.      }
12de0 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  .      free(zCon
12df0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20  verted);.    }. 
12e00 20 20 20 69 66 28 20 21 64 77 52 65 74 20 29 7b     if( !dwRet ){
12e10 0a 20 20 20 20 20 20 62 79 74 65 73 50 65 72 53  .      bytesPerS
12e20 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
12e30 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
12e40 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ZE;.    }.  }.#e
12e50 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 69  ndif.  return (i
12e60 6e 74 29 20 62 79 74 65 73 50 65 72 53 65 63 74  nt) bytesPerSect
12e70 6f 72 3b 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  or; .}..#ifndef 
12e80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
12e90 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
12ea0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
12eb0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
12ec0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
12ed0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
12ee0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
12ef0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
12f00 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
12f10 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
12f20 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
12f30 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
12f40 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
12f50 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
12f60 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
12f70 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
12f80 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
12f90 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
12fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12fb0 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
12fc0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
12fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12fe0 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
12ff0 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  h;.  void *zConv
13000 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
13010 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
13020 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
13030 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
13040 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
13050 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
13060 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
13070 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68   isNT() ){.    h
13080 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   = LoadLibraryW(
13090 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
130a0 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  ed);./* isNT() i
130b0 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
130c0 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
130d0 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
130e0 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
130f0 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
13100 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
13110 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
13120 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
13130 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
13140 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
13150 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
13160 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
13170 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
13180 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
13190 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62  .    h = LoadLib
131a0 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
131b0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
131c0 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
131d0 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
131e0 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
131f0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
13200 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
13210 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
13220 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
13230 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
13240 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65  ETER(pVfs);.  ge
13250 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e 42  tLastErrorMsg(nB
13260 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  uf, zBufOut);.}.
13270 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28  void (*winDlSym(
13280 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13290 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
132a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
132b0 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20  ymbol))(void){. 
132c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
132d0 52 28 70 56 66 73 29 3b 0a 23 69 66 20 53 51 4c  R(pVfs);.#if SQL
132e0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
132f0 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
13300 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
13310 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
13320 65 20 6f 6e 20 77 69 6e 63 65 2e 20 2a 2f 0a 20  e on wince. */. 
13330 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29   return (void(*)
13340 28 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64  (void))GetProcAd
13350 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
13360 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
13370 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c  ;.#else.  /* All
13380 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 73 20 70   other windows p
13390 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20  latforms expect 
133a0 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29  GetProcAddress()
133b0 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e   to take.  ** an
133c0 20 41 6e 73 69 20 73 74 72 69 6e 67 20 72 65 67   Ansi string reg
133d0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f  ardless of the _
133e0 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20  UNICODE setting 
133f0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  */.  return (voi
13400 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72  d(*)(void))GetPr
13410 6f 63 41 64 64 72 65 73 73 28 28 48 41 4e 44 4c  ocAddress((HANDL
13420 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  E)pHandle, zSymb
13430 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f  ol);.#endif.}.vo
13440 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71  id winDlClose(sq
13450 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
13460 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
13470 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13480 54 45 52 28 70 56 66 73 29 3b 0a 20 20 46 72 65  TER(pVfs);.  Fre
13490 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
134a0 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  )pHandle);.}.#el
134b0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
134c0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
134d0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
134e0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
134f0 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
13500 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
13510 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
13520 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
13530 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
13540 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  endif.../*.** Wr
13550 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62  ite up to nBuf b
13560 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65  ytes of randomne
13570 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f  ss into zBuf..*/
13580 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
13590 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
135a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
135b0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
135c0 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  f){.  int n = 0;
135d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
135e0 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64  TER(pVfs);.#if d
135f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
13600 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a  ST).  n = nBuf;.
13610 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
13620 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  , nBuf);.#else. 
13630 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54   if( sizeof(SYST
13640 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20  EMTIME)<=nBuf-n 
13650 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d  ){.    SYSTEMTIM
13660 45 20 78 3b 0a 20 20 20 20 47 65 74 53 79 73 74  E x;.    GetSyst
13670 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20  emTime(&x);.    
13680 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
13690 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
136a0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
136b0 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (x);.  }.  if( s
136c0 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
136d0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
136e0 44 20 70 69 64 20 3d 20 47 65 74 43 75 72 72 65  D pid = GetCurre
136f0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
13700 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
13710 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
13720 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
13730 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
13740 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
13750 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
13760 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
13770 20 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b   GetTickCount();
13780 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
13790 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
137a0 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
137b0 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
137c0 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
137d0 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
137e0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
137f0 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
13800 20 20 20 20 51 75 65 72 79 50 65 72 66 6f 72 6d      QueryPerform
13810 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b  anceCounter(&i);
13820 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
13830 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66  f[n], &i, sizeof
13840 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (i));.    n += s
13850 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65  izeof(i);.  }.#e
13860 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ndif.  return n;
13870 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
13880 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
13890 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
138a0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
138b0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
138c0 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
138d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
138e0 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
138f0 20 20 53 6c 65 65 70 28 28 6d 69 63 72 6f 73 65    Sleep((microse
13900 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
13910 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13920 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
13930 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
13940 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
13950 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
13960 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
13970 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
13980 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
13990 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
139a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
139b0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
139c0 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
139d0 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
139e0 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
139f0 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
13a00 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
13a10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
13a30 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
13a40 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
13a50 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
13a60 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
13a70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
13a80 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
13a90 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
13aa0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
13ab0 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
13ac0 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
13ad0 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
13ae0 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
13af0 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
13b00 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
13b10 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
13b20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
13b30 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
13b40 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
13b50 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
13b60 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
13b70 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
13b80 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
13b90 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
13ba0 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
13bb0 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
13bc0 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
13bd0 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
13be0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
13bf0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
13c00 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
13c10 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
13c20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
13c30 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
13c40 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
13c50 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
13c60 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
13c70 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
13c80 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
13c90 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
13ca0 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
13cb0 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
13cc0 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
13cd0 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
13ce0 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
13cf0 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
13d00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
13d10 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e  qlite3_int64 win
13d20 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20  FiletimeEpoch = 
13d30 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65  23058135*(sqlite
13d40 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
13d50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
13d60 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EST.  static con
13d70 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
13d80 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
13d90 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
13da0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65  nt64)8640000;.#e
13db0 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d  ndif.  /* 2^32 -
13dc0 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66   to avoid use of
13dd0 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73   LL and warnings
13de0 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61   in gcc */.  sta
13df0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
13e00 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74  3_int64 max32Bit
13e10 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28  Value = .      (
13e20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
13e30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
13e40 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
13e50 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
13e60 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
13e70 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
13e80 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
13e90 4d 45 20 74 69 6d 65 3b 0a 20 20 47 65 74 53 79  ME time;.  GetSy
13ea0 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
13eb0 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
13ec0 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
13ed0 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
13ee0 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
13ef0 28 21 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  (!SystemTimeToFi
13f00 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
13f10 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  )){.    return 1
13f20 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 47 65  ;.  }.#else.  Ge
13f30 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
13f40 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
13f50 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
13f60 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
13f70 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
13f80 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
13f90 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
13fa0 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
13fb0 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
13fc0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
13fd0 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
13fe0 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
13ff0 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
14000 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14010 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
14020 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
14030 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
14040 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
14050 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
14060 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
14070 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
14080 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14090 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
140a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
140b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
140c0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
140d0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
140e0 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
140f0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
14100 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
14110 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
14120 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
14130 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
14140 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
14150 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
14160 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
14170 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
14180 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
14190 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
141a0 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
141b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
141c0 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
141d0 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
141e0 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
141f0 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
14200 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
14210 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14220 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
14230 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
14240 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
14250 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
14260 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
14270 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
14280 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 77 69 6e  Message() on win
14290 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
142a0 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
142b0 28 29 20 6f 6e 20 75 6e 69 78 29 2e 20 41 66 74  () on unix). Aft
142c0 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
142d0 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
142e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
142f0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
14300 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
14310 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
14320 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
14330 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
14340 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
14350 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
14360 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
14370 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
14380 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
14390 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
143a0 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
143b0 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
143c0 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
143d0 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
143e0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
143f0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
14400 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
14410 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
14420 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
14430 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
14440 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
14450 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
14460 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
14470 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
14480 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
14490 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
144a0 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
144b0 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
144c0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
144d0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
144e0 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
144f0 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
14500 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
14510 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
14520 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
14530 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
14540 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
14550 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
14560 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
14570 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
14580 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
14590 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
145a0 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
145b0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
145c0 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
145d0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
145e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
145f0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
14600 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
14610 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
14620 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
14630 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
14640 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
14650 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
14660 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
14670 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
14680 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
14690 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
146a0 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
146b0 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
146c0 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
146d0 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
146e0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
146f0 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
14700 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
14710 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
14720 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
14730 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
14740 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
14750 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
14760 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
14770 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
14780 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  Vfs);.  return g
14790 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e  etLastErrorMsg(n
147a0 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 0a  Buf, zBuf);.}...
147b0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
147c0 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
147d0 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
147e0 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
147f0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
14800 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
14810 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
14820 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
14830 0a 20 20 20 20 32 2c 20 20 20 20 20 20 20 20 20  .    2,         
14840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
14850 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
14860 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
14870 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
14880 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20  .    MAX_PATH,  
14890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
148a0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
148b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
148c0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
148d0 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
148e0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
148f0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14910 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
14920 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
14930 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
14940 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
14950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
14960 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
14970 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
14980 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
14990 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
149a0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
149b0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
149c0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
149d0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
149e0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
149f0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
14a00 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
14a10 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
14a20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
14a30 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
14a40 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
14a50 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
14a60 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
14a70 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
14a80 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
14a90 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
14aa0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
14ab0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
14ac0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
14ad0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
14ae0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
14af0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
14b00 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
14b10 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
14b20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
14b30 34 20 2a 2f 0a 20 20 7d 3b 0a 0a 23 69 66 6e 64  4 */.  };..#ifnd
14b40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
14b50 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  AL.  /* get memo
14b60 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
14b70 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
14b80 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
14b90 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
14ba0 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
14bb0 20 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28    GetSystemInfo(
14bc0 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 20 20  &winSysInfo);.  
14bd0 61 73 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66  assert(winSysInf
14be0 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
14bf0 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a  anularity > 0);.
14c00 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
14c10 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
14c20 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65  winVfs, 1);.  re
14c30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
14c40 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
14c50 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
14c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14c70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
14c80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.