/ Hex Artifact Content
Login

Artifact 7d27ec1e65069d7ce8d698a475cc3550b8dbae15:


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 38 20 6c 6f 63 6b 74 79 70 65 3b  /.  u8 locktype;
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* 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 75 38 20 62 50 65 72 73  ck */.  u8 bPers
0e10: 69 73 74 57 61 6c 3b 20 20 20 20 20 20 20 20 20  istWal;         
0e20: 2f 2a 20 54 72 75 65 20 74 6f 20 70 65 72 73 69  /* True to persi
0e30: 73 74 20 57 41 4c 20 66 69 6c 65 73 20 2a 2f 0a  st WAL files */.
0e40: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
0e50: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  o;        /* The
0e60: 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
0e70: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
0e80: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 44 57 4f 52   error */.  DWOR
0e90: 44 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  D sectorSize;   
0ea0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
0eb0: 7a 65 20 6f 66 20 74 68 65 20 64 65 76 69 63 65  ze of the device
0ec0: 20 66 69 6c 65 20 69 73 20 6f 6e 20 2a 2f 0a 20   file is on */. 
0ed0: 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20 20   winShm *pShm;  
0ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74           /* Inst
0ef0: 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20 6d  ance of shared m
0f00: 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66 69  emory on this fi
0f10: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
0f20: 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20  ar *zPath;      
0f30: 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65  /* Full pathname
0f40: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   of this file */
0f50: 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20  .  int szChunk; 
0f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
0f70: 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75  unk size configu
0f80: 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55  red by FCNTL_CHU
0f90: 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53  NK_SIZE */.#if S
0fa0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
0fb0: 20 57 43 48 41 52 20 2a 7a 44 65 6c 65 74 65 4f   WCHAR *zDeleteO
0fc0: 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65  nClose;  /* Name
0fd0: 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
0fe0: 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  te when closing 
0ff0: 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74  */.  HANDLE hMut
1000: 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ex;          /* 
1010: 4d 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f  Mutex used to co
1020: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
1030: 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20  shared lock */  
1040: 0a 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65  .  HANDLE hShare
1050: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68  d;         /* Sh
1060: 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d  ared memory segm
1070: 65 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ent used for loc
1080: 6b 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c  king */.  winceL
1090: 6f 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20  ock local;      
10a0: 20 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69    /* Locks obtai
10b0: 6e 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74  ned by this inst
10c0: 61 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20  ance of winFile 
10d0: 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a  */.  winceLock *
10e0: 73 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20  shared;      /* 
10f0: 47 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f  Global shared lo
1100: 63 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  ck memory for th
1110: 65 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69  e file  */.#endi
1120: 66 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63  f.};../*. * If c
1130: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
1140: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
1150: 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20   on Windows, we 
1160: 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20  will use the. * 
1170: 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50  various Win32 AP
1180: 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73  I heap functions
1190: 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20   instead of our 
11a0: 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20  own.. */.#ifdef 
11b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
11c0: 4c 4f 43 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e  LOC./*. * The in
11d0: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
11e0: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
11f0: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
1200: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
1210: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1220: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
1230: 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  IT_SIZE.#  defin
1240: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
1250: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28  EAP_INIT_SIZE ((
1260: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
1270: 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20  ACHE_SIZE) * \. 
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45        (SQLITE_DE
12b0: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
12c0: 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64   + 4194304).#end
12d0: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61  if../*. * The ma
12e0: 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68  ximum size of th
12f0: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
1300: 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c   heap.  This val
1310: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a  ue may be zero..
1320: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1330: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
1340: 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  X_SIZE.#  define
1350: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1360: 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29  AP_MAX_SIZE  (0)
1370: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1380: 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74  he winMemData st
1390: 72 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69  ructure stores i
13a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69  nformation requi
13b0: 72 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32  red by the Win32
13c0: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c  -specific.** sql
13d0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
13e0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
13f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1400: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
1410: 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74  nMemData;.struct
1420: 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 20 20   winMemData {.  
1430: 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a  u32 magic;    /*
1440: 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f   Magic number to
1450: 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72   detect structur
1460: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f  e corruption. */
1470: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
1480: 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74   /* The handle t
1490: 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20  o our heap. */. 
14a0: 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f   BOOL bOwned;  /
14b0: 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20  * Do we own the 
14c0: 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72  heap (i.e. destr
14d0: 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77  oy it on shutdow
14e0: 6e 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  n)? */.};..#defi
14f0: 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20  ne WINMEM_MAGIC 
1500: 20 20 20 20 30 78 34 32 62 32 38 33 30 62 0a 0a      0x42b2830b..
1510: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
1520: 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d  nMemData win_mem
1530: 5f 64 61 74 61 20 3d 20 7b 20 57 49 4e 4d 45 4d  _data = { WINMEM
1540: 5f 4d 41 47 49 43 2c 20 4e 55 4c 4c 2c 20 46 41  _MAGIC, NULL, FA
1550: 4c 53 45 20 7d 3b 0a 0a 23 64 65 66 69 6e 65 20  LSE };..#define 
1560: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
1570: 63 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  c() assert( win_
1580: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d  mem_data.magic==
1590: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23  WINMEM_MAGIC ).#
15a0: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
15b0: 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64  Heap() win_mem_d
15c0: 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74 69  ata.hHeap..stati
15d0: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61  c void *winMemMa
15e0: 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29  lloc(int nBytes)
15f0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
1600: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
1610: 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76  Prior);.static v
1620: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
1630: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
1640: 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74   int nBytes);.st
1650: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53  atic int winMemS
1660: 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74  ize(void *p);.st
1670: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52  atic int winMemR
1680: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73  oundup(int n);.s
1690: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
16a0: 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44  Init(void *pAppD
16b0: 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ata);.static voi
16c0: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
16d0: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
16e0: 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ;..const sqlite3
16f0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
1700: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
1710: 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f  (void);.#endif /
1720: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
1730: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
1740: 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74 79 70  Forward prototyp
1750: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
1760: 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28  t getSectorSize(
1770: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1780: 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e 73   *pVfs,.    cons
1790: 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
17a0: 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 66  e     /* UTF-8 f
17b0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b 0a 0a  ile name */.);..
17c0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
17d0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
17e0: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
17f0: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
1800: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
1810: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
1820: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
1830: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
1840: 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57 69 6e   Win95.** or Win
1850: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
1860: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1870: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
1880: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
1890: 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a 20 32  m is Win95..** 2
18a0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
18b0: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
18c0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
18d0: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
18e0: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
18f0: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
1900: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
1910: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
1920: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
1930: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
1940: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
1950: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
1960: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1970: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74   = 0;.#else.stat
1980: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ic int sqlite3_o
1990: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64  s_type = 0;.#end
19a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
19b0: 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29   true (non-zero)
19c0: 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69   if we are runni
19d0: 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20  ng under WinNT, 
19e0: 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a  Win2K, WinXP,.**
19f0: 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75   or WinCE.  Retu
1a00: 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20  rn false (zero) 
1a10: 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  for Win95, Win98
1a20: 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a  , or WinME..**.*
1a30: 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74  * Here is an int
1a40: 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61  eresting observa
1a50: 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69  tion:  Win95, Wi
1a60: 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c  n98, and WinME l
1a70: 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  ack.** the LockF
1a80: 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75  ileEx() API.  Bu
1a90: 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73  t we can still s
1aa0: 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61  tatically link a
1ab0: 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41  gainst that.** A
1ac0: 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65  PI as long as we
1ad0: 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77   don't call it w
1ae0: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39  hen running Win9
1af0: 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c  5/98/ME.  A call
1b00: 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
1b10: 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  ine is used to d
1b20: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
1b30: 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38  host is Win95/98
1b40: 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f  /ME or.** WinNT/
1b50: 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65  2K/XP so that we
1b60: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68   will know wheth
1b70: 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e  er or not we can
1b80: 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20   safely call.** 
1b90: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
1ba0: 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   API..*/.#if SQL
1bb0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 20 64  ITE_OS_WINCE.# d
1bc0: 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31  efine isNT()  (1
1bd0: 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63  ).#else.  static
1be0: 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b   int isNT(void){
1bf0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1c00: 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  _os_type==0 ){. 
1c10: 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e       OSVERSIONIN
1c20: 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  FO sInfo;.      
1c30: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
1c40: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
1c50: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20  of(sInfo);.     
1c60: 20 47 65 74 56 65 72 73 69 6f 6e 45 78 28 26 73   GetVersionEx(&s
1c70: 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
1c80: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73  ite3_os_type = s
1c90: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
1ca0: 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f  d==VER_PLATFORM_
1cb0: 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31  WIN32_NT ? 2 : 1
1cc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1cd0: 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  rn sqlite3_os_ty
1ce0: 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  pe==2;.  }.#endi
1cf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
1d00: 49 4e 43 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  INCE */..#ifdef 
1d10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
1d20: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  LOC./*.** Alloca
1d30: 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d  te nBytes of mem
1d40: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
1d50: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
1d60: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  c(int nBytes){. 
1d70: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
1d80: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
1d90: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
1da0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
1db0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
1dc0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
1dd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
1de0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
1df0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64  LE_VALUE );.#ifd
1e00: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1e10: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a  MALLOC_VALIDATE.
1e20: 20 20 61 73 73 65 72 74 20 28 20 48 65 61 70 56    assert ( HeapV
1e30: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 30  alidate(hHeap, 0
1e40: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
1e50: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
1e60: 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 48  es>=0 );.  p = H
1e70: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
1e80: 30 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  0, (SIZE_T)nByte
1e90: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
1ea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1eb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
1ec0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
1ed0: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 64 29  oc %u bytes (%d)
1ee0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
1ef0: 20 20 20 20 6e 42 79 74 65 73 2c 20 47 65 74 4c      nBytes, GetL
1f00: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
1f10: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
1f20: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1f30: 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e  .** Free memory.
1f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f50: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
1f60: 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44  *pPrior){.  HAND
1f70: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
1f80: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
1f90: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
1fa0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
1fb0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
1fc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
1fd0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
1fe0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64  LE_VALUE );.#ifd
1ff0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2000: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a  MALLOC_VALIDATE.
2010: 20 20 61 73 73 65 72 74 20 28 20 48 65 61 70 56    assert ( HeapV
2020: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 30  alidate(hHeap, 0
2030: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
2040: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
2050: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
2060: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
2070: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
2080: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
2090: 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20  HeapFree(hHeap, 
20a0: 30 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20  0, pPrior) ){.  
20b0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
20c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
20d0: 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20  led to HeapFree 
20e0: 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68  block %p (%d), h
20f0: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
2100: 20 70 50 72 69 6f 72 2c 20 47 65 74 4c 61 73 74   pPrior, GetLast
2110: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
2120: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hHeap);.  }.}../
2130: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2140: 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74  size of an exist
2150: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
2160: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
2170: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
2180: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
2190: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  , int nBytes){. 
21a0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
21b0: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
21c0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
21d0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
21e0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
21f0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
2200: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
2210: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
2220: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64  LE_VALUE );.#ifd
2230: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2240: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a  MALLOC_VALIDATE.
2250: 20 20 61 73 73 65 72 74 20 28 20 48 65 61 70 56    assert ( HeapV
2260: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 30  alidate(hHeap, 0
2270: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
2280: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
2290: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
22a0: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
22b0: 70 20 3d 20 48 65 61 70 41 6c 6c 6f 63 28 68 48  p = HeapAlloc(hH
22c0: 65 61 70 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29  eap, 0, (SIZE_T)
22d0: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65  nBytes);.  }else
22e0: 7b 0a 20 20 20 20 70 20 3d 20 48 65 61 70 52 65  {.    p = HeapRe
22f0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 30 2c 20  Alloc(hHeap, 0, 
2300: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
2310: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
2320: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
2330: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
2340: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
2350: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
2360: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
2370: 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22        pPrior ? "
2380: 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22  HeapReAlloc" : "
2390: 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74  HeapAlloc", nByt
23a0: 65 73 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72  es, GetLastError
23b0: 28 29 2c 0a 20 20 20 20 20 20 20 20 28 76 6f 69  (),.        (voi
23c0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
23d0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
23e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
23f0: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
2400: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
2410: 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  , in bytes..*/.s
2420: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
2430: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
2440: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
2450: 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69   SIZE_T n;..  wi
2460: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
2470: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
2480: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
2490: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
24a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
24b0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
24c0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
24d0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
24e0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
24f0: 0a 20 20 61 73 73 65 72 74 20 28 20 48 65 61 70  .  assert ( Heap
2500: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
2510: 30 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  0, NULL) );.#end
2520: 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  if.  if( !p ) re
2530: 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 48 65  turn 0;.  n = He
2540: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 30 2c  apSize(hHeap, 0,
2550: 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53   p);.  if( n==(S
2560: 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20  IZE_T)-1 ){.    
2570: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
2580: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
2590: 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c  d to HeapSize bl
25a0: 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61  ock %p (%d), hea
25b0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 70  p=%p",.        p
25c0: 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  , GetLastError()
25d0: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
25e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
25f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
2600: 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  )n;.}../*.** Rou
2610: 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20  nd up a request 
2620: 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74  size to the next
2630: 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f   valid allocatio
2640: 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
2650: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
2660: 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65  dup(int n){.  re
2670: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
2680: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
2690: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
26a0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
26b0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
26c0: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
26d0: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
26e0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
26f0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
2700: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2720: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
2730: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d  MemData->magic==
2740: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a  WINMEM_MAGIC );.
2750: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
2760: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
2770: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
2780: 65 61 70 20 3d 20 48 65 61 70 43 72 65 61 74 65  eap = HeapCreate
2790: 28 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (0, SQLITE_WIN32
27a0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c  _HEAP_INIT_SIZE,
27b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
27e0: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29  2_HEAP_MAX_SIZE)
27f0: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
2800: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
2810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
2820: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
2830: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
2840: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
2850: 20 28 25 64 29 2c 20 69 6e 69 74 53 69 7a 65 3d   (%d), initSize=
2860: 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c  %u, maxSize=%u",
2870: 0a 20 20 20 20 20 20 20 20 20 20 47 65 74 4c 61  .          GetLa
2880: 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54  stError(), SQLIT
2890: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
28a0: 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  T_SIZE,.        
28b0: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
28c0: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20  EAP_MAX_SIZE);. 
28d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28e0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
28f0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
2900: 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a  >bOwned = TRUE;.
2910: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 57    }.  assert( pW
2920: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
2930: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2940: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
2950: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
2960: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
2970: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2980: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
2990: 0a 20 20 61 73 73 65 72 74 28 20 48 65 61 70 56  .  assert( HeapV
29a0: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
29b0: 61 74 61 2d 3e 68 48 65 61 70 2c 20 30 2c 20 4e  ata->hHeap, 0, N
29c0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
29d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
29f0: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
2a00: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
2a10: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
2a20: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
2a30: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
2a40: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
2a50: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
2a60: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
2a70: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
2a80: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69  eturn;.  if( pWi
2a90: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
2aa0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2ab0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
2ac0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
2ad0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64 65  E_VALUE );.#ifde
2ae0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
2af0: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20  ALLOC_VALIDATE. 
2b00: 20 20 20 61 73 73 65 72 74 28 20 48 65 61 70 56     assert( HeapV
2b10: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
2b20: 61 74 61 2d 3e 68 48 65 61 70 2c 20 30 2c 20 4e  ata->hHeap, 0, N
2b30: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
2b40: 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61     if( pWinMemDa
2b50: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20  ta->bOwned ){.  
2b60: 20 20 20 20 69 66 28 20 21 48 65 61 70 44 65 73      if( !HeapDes
2b70: 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61  troy(pWinMemData
2b80: 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20  ->hHeap) ){.    
2b90: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
2ba0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
2bb0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73  ailed to HeapDes
2bc0: 74 72 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d  troy (%d), heap=
2bd0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
2be0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c   GetLastError(),
2bf0: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
2c00: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
2c10: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
2c20: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
2c30: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
2c40: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
2c50: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
2c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
2c70: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
2c80: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c90: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
2ca0: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
2cb0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2cc0: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
2cd0: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
2ce0: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
2cf0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
2d00: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
2d10: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
2d20: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
2d30: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
2d40: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
2d50: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
2d60: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
2d70: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
2d80: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
2d90: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
2da0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
2db0: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
2dc0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
2dd0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2de0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
2df0: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
2e00: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
2e10: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
2e20: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
2e30: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
2e40: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
2e50: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
2e60: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
2e70: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
2e80: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
2e90: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
2ea0: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
2eb0: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
2ec0: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
2ed0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
2ee0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
2ef0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
2f00: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
2f10: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
2f20: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
2f30: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
2f40: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
2f50: 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f 73  string to micros
2f60: 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55 54 46  oft unicode (UTF
2f70: 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70  -16?). .**.** Sp
2f80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
2f90: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
2fa0: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
2fb0: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74   malloc..*/.stat
2fc0: 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54 6f  ic WCHAR *utf8To
2fd0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
2fe0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
2ff0: 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 57    int nChar;.  W
3000: 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e  CHAR *zWideFilen
3010: 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20  ame;..  nChar = 
3020: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
3030: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
3040: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
3050: 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69 64 65  ULL, 0);.  zWide
3060: 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  Filename = mallo
3070: 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  c( nChar*sizeof(
3080: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d  zWideFilename[0]
3090: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
30a0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
30b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
30c0: 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74 69  .  nChar = Multi
30d0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
30e0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
30f0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46  name, -1, zWideF
3100: 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72 29 3b  ilename, nChar);
3110: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
3120: 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 57 69 64  ){.    free(zWid
3130: 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  eFilename);.    
3140: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
3150: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
3160: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zWideFilename;.}
3170: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
3180: 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f 64  microsoft unicod
3190: 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  e to UTF-8.  Spa
31a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
31b0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
31c0: 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
31d0: 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  om malloc()..*/.
31e0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
31f0: 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73 74  codeToUtf8(const
3200: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
3210: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
3220: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
3230: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
3240: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
3250: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
3260: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
3270: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
3280: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  );.  zFilename =
3290: 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29   malloc( nByte )
32a0: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
32b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
32c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
32d0: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
32e0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
32f0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
3300: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
3310: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
3340: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
3350: 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65  {.    free(zFile
3360: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
3370: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
3380: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
3390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
33a0: 72 74 20 61 6e 20 61 6e 73 69 20 73 74 72 69 6e  rt an ansi strin
33b0: 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20 75  g to microsoft u
33c0: 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e  nicode, based on
33d0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
33e0: 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67  codepage setting
33f0: 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e  s for file apis.
3400: 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f  .** .** Space to
3410: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
3420: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
3430: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
3440: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
3450: 57 43 48 41 52 20 2a 6d 62 63 73 54 6f 55 6e 69  WCHAR *mbcsToUni
3460: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
3470: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
3480: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 43 48 41  nt nByte;.  WCHA
3490: 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  R *zMbcsFilename
34a0: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
34b0: 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41 4e   = AreFileApisAN
34c0: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
34d0: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
34e0: 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  te = MultiByteTo
34f0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
3500: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
3510: 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73 69 7a   -1, NULL,0)*siz
3520: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 7a 4d  eof(WCHAR);.  zM
3530: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61  bcsFilename = ma
3540: 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
3550: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
3560: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
3570: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
3580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
3590: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75    }.  nByte = Mu
35a0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
35b0: 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  r(codepage, 0, z
35c0: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d  Filename, -1, zM
35d0: 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  bcsFilename, nBy
35e0: 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  te);.  if( nByte
35f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ==0 ){.    free(
3600: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a  zMbcsFilename);.
3610: 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d      zMbcsFilenam
3620: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
3630: 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  urn zMbcsFilenam
3640: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
3650: 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e  ert microsoft un
3660: 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 62 79  icode to multiby
3670: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
3680: 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ing, based on th
3690: 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 6e 73 69  e.** user's Ansi
36a0: 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   codepage..**.**
36b0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
36c0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
36d0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
36e0: 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 2e  rom.** malloc().
36f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3700: 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 63  *unicodeToMbcs(c
3710: 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57 69 64  onst WCHAR *zWid
3720: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
3730: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
3740: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
3750: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72 65  t codepage = Are
3760: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
3770: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
3780: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 57  CP;..  nByte = W
3790: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
37a0: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
37b0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
37c0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
37d0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61    zFilename = ma
37e0: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
37f0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
3800: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3810: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
3820: 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69   WideCharToMulti
3830: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
3840: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
3850: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
3860: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
3890: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
38a0: 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65 6e 61      free(zFilena
38b0: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
38c0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
38d0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
38e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
38f0: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
3900: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
3910: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
3920: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
3930: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
3940: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
3950: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
3960: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
3970: 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74  cs_to_utf8(const
3980: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
3990: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
39a0: 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43 48 41  nameUtf8;.  WCHA
39b0: 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  R *zTmpWide;..  
39c0: 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 54  zTmpWide = mbcsT
39d0: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
39e0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
39f0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
3a00: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
3a10: 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e  ilenameUtf8 = un
3a20: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
3a30: 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a 54  Wide);.  free(zT
3a40: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
3a50: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
3a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
3a70: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
3a80: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
3a90: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
3aa0: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
3ab0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
3ac0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
3ad0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
3ae0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
3af0: 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e  utf8_to_mbcs(con
3b00: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
3b10: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
3b20: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 57 43  lenameMbcs;.  WC
3b30: 48 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a  HAR *zTmpWide;..
3b40: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66    zTmpWide = utf
3b50: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
3b60: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
3b70: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
3b80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3b90: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20  zFilenameMbcs = 
3ba0: 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54  unicodeToMbcs(zT
3bb0: 6d 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28  mpWide);.  free(
3bc0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
3bd0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  urn zFilenameMbc
3be0: 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  s;.}.../*.** The
3bf0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
3c00: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
3c10: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
3c20: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
3c30: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
3c40: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
3c50: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
3c60: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
3c70: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
3c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c  .static int getL
3c90: 61 73 74 45 72 72 6f 72 4d 73 67 28 69 6e 74 20  astErrorMsg(int 
3ca0: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
3cb0: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
3cc0: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
3cd0: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
3ce0: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
3cf0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
3d00: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
3d10: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
3d20: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
3d30: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
3d40: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
3d50: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
3d60: 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74   error = GetLast
3d70: 45 72 72 6f 72 28 29 3b 0a 20 20 44 57 4f 52 44  Error();.  DWORD
3d80: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
3d90: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
3da0: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
3db0: 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 57     WCHAR *zTempW
3dc0: 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ide = NULL;.    
3dd0: 64 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65  dwLen = FormatMe
3de0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
3df0: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
3e00: 55 46 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d  UFFER | FORMAT_M
3e10: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
3e20: 45 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53  EM | FORMAT_MESS
3e30: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
3e40: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
3e60: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e80: 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  error,.         
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
3ed0: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
3f10: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
3f20: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
3f30: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
3f40: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
3f50: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 7a   UTF8 */.      z
3f60: 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  Out = unicodeToU
3f70: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
3f80: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
3f90: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
3fa0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
3fb0: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
3fc0: 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54      LocalFree(zT
3fd0: 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a  empWide);.    }.
3fe0: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
3ff0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4000: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
4010: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
4020: 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
4030: 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
4040: 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
4050: 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
4060: 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
4070: 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
4080: 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
4090: 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
40a0: 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
40b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
40c0: 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
40d0: 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55  char *zTemp = NU
40e0: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
40f0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
4100: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
4110: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 20  LOCATE_BUFFER | 
4120: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
4130: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52  ROM_SYSTEM | FOR
4140: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
4150: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4190: 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a 20          error,. 
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41d0: 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20          (LPSTR) 
41e0: 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20  &zTemp,.        
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
4230: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
4240: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
4250: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
4260: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
4270: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
4280: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
4290: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
42a0: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
42b0: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
42c0: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
42d0: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
42e0: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29  LocalFree(zTemp)
42f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4300: 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77   }.  if( 0 == dw
4310: 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
4320: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
4330: 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72  , zBuf, "OsError
4340: 20 30 78 25 78 20 28 25 75 29 22 2c 20 65 72 72   0x%x (%u)", err
4350: 6f 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d 65  or, error);.  }e
4360: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
4370: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
4380: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
4390: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
43a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
43b0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
43c0: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
43d0: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
43e0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 66 72  buffer */.    fr
43f0: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  ee(zOut);.  }.  
4400: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4410: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4420: 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f  ion - winLogErro
4430: 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f  rAtLine() - is o
4440: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
4450: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
4460: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a   winLogError()..
4470: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4480: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  ne is invoked af
4490: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
44a0: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
44b0: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67  ction..** It log
44c0: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
44d0: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
44e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
44f0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
4500: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
4510: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
4520: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
4530: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
4540: 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  om .** FormatMes
4550: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
4560: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
4570: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
4580: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
4590: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
45a0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
45b0: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
45c0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
45d0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
45e0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
45f0: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
4600: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
4610: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
4620: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
4630: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
4640: 64 20 61 6e 64 20 74 68 65 20 74 68 65 20 61 73  d and the the as
4650: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
4660: 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e  stem path, if an
4670: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  y..*/.#define wi
4680: 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  nLogError(a,b,c)
4690: 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
46a0: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
46b0: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
46c0: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
46d0: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
46e0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
46f0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
4700: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
4710: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
4720: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
4730: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
4740: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
4750: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
4760: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
4770: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4780: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
4790: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
47a0: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
47d0: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
47e0: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
47f0: 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30  {.  char zMsg[50
4800: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0];             
4810: 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61      /* Human rea
4820: 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74  dable error text
4830: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
4860: 75 6e 74 65 72 20 2a 2f 0a 20 20 44 57 4f 52 44  unter */.  DWORD
4870: 20 69 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73   iErrno = GetLas
4880: 74 45 72 72 6f 72 28 29 3b 20 20 2f 2a 20 45 72  tError();  /* Er
4890: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 7a  ror code */..  z
48a0: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65  Msg[0] = 0;.  ge
48b0: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 73 69  tLastErrorMsg(si
48c0: 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67  zeof(zMsg), zMsg
48d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72 72  );.  assert( err
48e0: 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  code!=SQLITE_OK 
48f0: 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  );.  if( zPath==
4900: 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a  0 ) zPath = "";.
4910: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b    for(i=0; zMsg[
4920: 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27  i] && zMsg[i]!='
4930: 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  \r' && zMsg[i]!=
4940: 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a  '\n'; i++){}.  z
4950: 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71  Msg[i] = 0;.  sq
4960: 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64  lite3_log(errcod
4970: 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e  e,.      "os_win
4980: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
4990: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
49a0: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
49b0: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73  Func, zPath, zMs
49c0: 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  g.  );..  return
49d0: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
49e0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
49f0: 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52 65   times that a Re
4a00: 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46  adFile(), WriteF
4a10: 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74  ile(), and Delet
4a20: 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20  eFile().** will 
4a30: 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f  be retried follo
4a40: 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65  wing a locking e
4a50: 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20  rror - probably 
4a60: 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e  caused by .** an
4a70: 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  tivirus software
4a80: 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74  .  Also the init
4a90: 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65  ial delay before
4aa0: 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79   the first retry
4ab0: 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69  ..** The delay i
4ac0: 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c  ncreases linearl
4ad0: 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72  y with each retr
4ae0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
4af0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
4b00: 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20  _RETRY.# define 
4b10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
4b20: 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64  RR_RETRY 10.#end
4b30: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
4b40: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
4b50: 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69  TRY_DELAY.# defi
4b60: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
4b70: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
4b80: 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74  Y 25.#endif.stat
4b90: 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72  ic int win32Ioer
4ba0: 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f  rRetry = SQLITE_
4bb0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
4bc0: 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  Y;.static int wi
4bd0: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
4be0: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
4bf0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
4c00: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  LAY;../*.** If a
4c10: 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57   ReadFile() or W
4c20: 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72  riteFile() error
4c30: 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20   occurs, invoke 
4c40: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
4c50: 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f  to see if it sho
4c60: 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20  uld be retried. 
4c70: 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20   Return TRUE to 
4c80: 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46  retry.  Return F
4c90: 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20  ALSE.** to give 
4ca0: 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  up with an error
4cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4cc0: 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a  retryIoerr(int *
4cd0: 70 6e 52 65 74 72 79 29 7b 0a 20 20 44 57 4f 52  pnRetry){.  DWOR
4ce0: 44 20 65 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65  D e;.  if( *pnRe
4cf0: 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52  try>=win32IoerrR
4d00: 65 74 72 79 20 29 7b 0a 20 20 20 20 72 65 74 75  etry ){.    retu
4d10: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 65 20 3d 20  rn 0;.  }.  e = 
4d20: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
4d30: 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41    if( e==ERROR_A
4d40: 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a  CCESS_DENIED ||.
4d50: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c        e==ERROR_L
4d60: 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c  OCK_VIOLATION ||
4d70: 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f  .      e==ERROR_
4d80: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
4d90: 4e 20 29 7b 0a 20 20 20 20 53 6c 65 65 70 28 77  N ){.    Sleep(w
4da0: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
4db0: 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
4dc0: 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
4dd0: 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
4de0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20  .}../*.** Log a 
4e00: 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20  I/O error retry 
4e10: 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  episode..*/.stat
4e20: 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65 72 72  ic void logIoerr
4e30: 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20  (int nRetry){.  
4e40: 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20  if( nRetry ){.  
4e50: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
4e60: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20  LITE_IOERR, .   
4e70: 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73     "delayed %dms
4e80: 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e   for lock/sharin
4e90: 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20  g conflict",.   
4ea0: 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
4eb0: 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28  ryDelay*nRetry*(
4ec0: 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20  nRetry+1)/2.    
4ed0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
4ee0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a  LITE_OS_WINCE./*
4ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f30: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73  ********.** This
4f40: 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e   section contain
4f50: 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45  s code for WinCE
4f60: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   only..*/./*.** 
4f70: 57 69 6e 64 6f 77 73 43 45 20 64 6f 65 73 20 6e  WindowsCE does n
4f80: 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74  ot have a localt
4f90: 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ime() function. 
4fa0: 20 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20   So create a.** 
4fb0: 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23  substitute..*/.#
4fc0: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
4fd0: 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64  .struct tm *__cd
4fe0: 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f  ecl localtime(co
4ff0: 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b  nst time_t *t).{
5000: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
5010: 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d   tm y;.  FILETIM
5020: 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59  E uTm, lTm;.  SY
5030: 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20  STEMTIME pTm;.  
5040: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36  sqlite3_int64 t6
5050: 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20  4;.  t64 = *t;. 
5060: 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31   t64 = (t64 + 11
5070: 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30  644473600)*10000
5080: 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77  000;.  uTm.dwLow
5090: 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52  DateTime = (DWOR
50a0: 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46  D)(t64 & 0xFFFFF
50b0: 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69  FFF);.  uTm.dwHi
50c0: 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f  ghDateTime= (DWO
50d0: 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a  RD)(t64 >> 32);.
50e0: 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61    FileTimeToLoca
50f0: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
5100: 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65  lTm);.  FileTime
5110: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
5120: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
5130: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
5140: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
5150: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
5160: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
5170: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
5180: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
5190: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
51a0: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
51b0: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
51c0: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
51d0: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
51e0: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
51f0: 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  n &y;.}../* This
5200: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 63   will never be c
5210: 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66 69 6e  alled, but defin
5220: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 63  ed to make the c
5230: 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 23  ode compile */.#
5240: 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70 50 61  define GetTempPa
5250: 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66 69 6e  thA(a,b)..#defin
5260: 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63  e LockFile(a,b,c
5270: 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63  ,d,e)       winc
5280: 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c  eLockFile(&a, b,
5290: 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66 69 6e   c, d, e).#defin
52a0: 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c 62  e UnlockFile(a,b
52b0: 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 6e 63  ,c,d,e)     winc
52c0: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  eUnlockFile(&a, 
52d0: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66  b, c, d, e).#def
52e0: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 61  ine LockFileEx(a
52f0: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20 77 69  ,b,c,d,e,f)   wi
5300: 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 26 61  nceLockFileEx(&a
5310: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66 29  , b, c, d, e, f)
5320: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
5330: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
5340: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
5350: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
5360: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
5370: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
5380: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
5390: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
53a0: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
53b0: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
53c0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
53d0: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
53e0: 77 45 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69  wErr = WaitForSi
53f0: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
5400: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
5410: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
5420: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
5430: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
5440: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
5450: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
5460: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
5470: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
5480: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
5490: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
54a0: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
54b0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
54c0: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
54d0: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
54e0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
54f0: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
5500: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
5510: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43  atic BOOL winceC
5520: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
5530: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
5540: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
5550: 7b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6f 6b 3b  {.  WCHAR *zTok;
5560: 0a 20 20 57 43 48 41 52 20 2a 7a 4e 61 6d 65 20  .  WCHAR *zName 
5570: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
5580: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 42 4f  zFilename);.  BO
5590: 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
55a0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
55b0: 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
55c0: 64 61 74 61 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65  data */.  ZeroMe
55d0: 6d 6f 72 79 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mory(&pFile->loc
55e0: 61 6c 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65  al, sizeof(pFile
55f0: 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
5600: 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
5610: 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
5620: 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
5630: 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
5640: 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
5650: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
5660: 6f 6b 20 3d 20 43 68 61 72 4c 6f 77 65 72 57 28  ok = CharLowerW(
5670: 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b  zName);.  for (;
5680: 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20  *zTok;zTok++){. 
5690: 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20     if (*zTok == 
56a0: 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f  '\\') *zTok = '_
56b0: 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65  ';.  }..  /* Cre
56c0: 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d  ate/open the nam
56d0: 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46  ed mutex */.  pF
56e0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 43 72  ile->hMutex = Cr
56f0: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
5700: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
5710: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
5720: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
5730: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
5740: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
5750: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
5760: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 77 69 6e  LITE_ERROR, "win
5770: 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20  ceCreateLock1", 
5780: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
5790: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
57a0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20   return FALSE;. 
57b0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
57c0: 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72   the mutex befor
57d0: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a  e continuing */.
57e0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
57f0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
5800: 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63  x);.  .  /* Sinc
5810: 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e  e the names of n
5820: 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65  amed mutexes, se
5830: 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d  maphores, file m
5840: 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 20  appings etc are 
5850: 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69  .  ** case-sensi
5860: 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e  tive, take advan
5870: 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79 20  tage of that by 
5880: 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65 20  uppercasing the 
5890: 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20  mutex name.  ** 
58a0: 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20 61  and using that a
58b0: 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69 6c  s the shared fil
58c0: 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20  emapping name.. 
58d0: 20 2a 2f 0a 20 20 43 68 61 72 55 70 70 65 72 57   */.  CharUpperW
58e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
58f0: 2d 3e 68 53 68 61 72 65 64 20 3d 20 43 72 65 61  ->hShared = Crea
5900: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
5910: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
5920: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45    PAGE_READWRITE
5960: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
5970: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
59a0: 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53  Name);  ..  /* S
59b0: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
59c0: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
59d0: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
59e0: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
59f0: 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62   it .  ** must b
5a00: 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a  e zero-initializ
5a10: 65 64 20 2a 2f 0a 20 20 69 66 20 28 47 65 74 4c  ed */.  if (GetL
5a20: 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52  astError() == ER
5a30: 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
5a40: 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
5a50: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 66   FALSE;.  }..  f
5a60: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f  ree(zName);..  /
5a70: 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65  * If we succeede
5a80: 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20  d in making the 
5a90: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
5aa0: 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f  ndle, map it. */
5ab0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53  .  if (pFile->hS
5ac0: 68 61 72 65 64 29 7b 0a 20 20 20 20 70 46 69 6c  hared){.    pFil
5ad0: 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e  e->shared = (win
5ae0: 63 65 4c 6f 63 6b 2a 29 4d 61 70 56 69 65 77 4f  ceLock*)MapViewO
5af0: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  fFile(pFile->hSh
5b00: 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ared, .         
5b10: 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41      FILE_MAP_REA
5b20: 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  D|FILE_MAP_WRITE
5b30: 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  , 0, 0, sizeof(w
5b40: 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  inceLock));.    
5b50: 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61  /* If mapping fa
5b60: 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20  iled, close the 
5b70: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
5b80: 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69  ndle and erase i
5b90: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46  t */.    if (!pF
5ba0: 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20  ile->shared){.  
5bb0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
5bc0: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
5bd0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
5be0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
5bf0: 45 52 52 4f 52 2c 20 22 77 69 6e 63 65 43 72 65  ERROR, "winceCre
5c00: 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
5c10: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 43 6c 6f  name);.      Clo
5c20: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
5c30: 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
5c40: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
5c50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
5c60: 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
5c70: 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
5c80: 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
5c90: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
5ca0: 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
5cb0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61   if (pFile->hSha
5cc0: 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20  red == NULL){.  
5cd0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
5ce0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
5cf0: 78 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  x);.    CloseHan
5d00: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
5d10: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
5d20: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
5d30: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
5d40: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
5d50: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
5d60: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
5d70: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
5d80: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
5d90: 20 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70      ZeroMemory(p
5da0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73 69  File->shared, si
5db0: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
5dc0: 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
5dd0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
5de0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
5df0: 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a  urn TRUE;.}../*.
5e00: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
5e10: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
5e20: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
5e30: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
5e40: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
5e50: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
5e60: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
5e70: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
5e80: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
5e90: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
5ea0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
5eb0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
5ec0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
5ed0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
5ee0: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
5ef0: 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
5f00: 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
5f10: 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
5f20: 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
5f30: 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
5f40: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
5f50: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
5f60: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
5f70: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
5f80: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
5f90: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
5fa0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
5fb0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
5fc0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
5fd0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
5fe0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
5ff0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
6000: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
6010: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
6020: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
6030: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
6040: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
6050: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
6060: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
6070: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
6080: 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
6090: 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
60a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
60b0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
60c0: 65 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56 69  e */.    UnmapVi
60d0: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
60e0: 73 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c 6f  shared);.    Clo
60f0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
6100: 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
6110: 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
6120: 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
6130: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
6140: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20  File->hMutex);  
6150: 20 20 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64    .    CloseHand
6160: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
6170: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
6180: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  utex = NULL;.  }
6190: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d  .}../* .** An im
61a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
61b0: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41  the LockFile() A
61c0: 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f  PI of windows fo
61d0: 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  r wince.*/.stati
61e0: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
61f0: 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a  File(.  HANDLE *
6200: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
6210: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
6220: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
6230: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
6240: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
6250: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
6260: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
6270: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
6280: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
6290: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
62a0: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
62b0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
62c0: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
62d0: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
62e0: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
62f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6300: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
6310: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
6320: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
6330: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
6340: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
6350: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
6360: 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
6370: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
6380: 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
6390: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
63a0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
63b0: 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
63c0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
63d0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
63e0: 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
63f0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
6400: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
6410: 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
6420: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
6430: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
6440: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
6450: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
6460: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
6470: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
6480: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
6490: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
64a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
64b0: 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
64c0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
64d0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
64e0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
64f0: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
6500: 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
6510: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
6520: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
6530: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
6540: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
6550: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
6560: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
6570: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
6580: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
6590: 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
65a0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
65b0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
65c0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
65d0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
65e0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
65f0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
6600: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
6610: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
6620: 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
6630: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
6640: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
6650: 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
6660: 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
6670: 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
6680: 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
6690: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
66a0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
66b0: 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
66c0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
66d0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
66e0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
66f0: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
6700: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
6710: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
6720: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
6730: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
6740: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
6750: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
6760: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
6770: 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  VED_BYTE && nNum
6780: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
6790: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
67a0: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
67b0: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
67c0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
67d0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
67e0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
67f0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
6800: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
6810: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
6820: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
6830: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
6840: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
6850: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
6860: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
6870: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
6880: 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
6890: 69 6c 65 20 41 50 49 20 6f 66 20 77 69 6e 64 6f  ile API of windo
68a0: 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a  ws for wince.*/.
68b0: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
68c0: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  eUnlockFile(.  H
68d0: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
68e0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
68f0: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
6900: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
6910: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
6920: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
6930: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
6940: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
6950: 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
6960: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
6970: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
6980: 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
6990: 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
69a0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
69b0: 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
69c0: 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
69d0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
69e0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
69f0: 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
6a00: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
6a10: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
6a20: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
6a30: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
6a40: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
6a50: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72  a reader lock or
6a60: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
6a70: 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  ck */.  if (dwFi
6a80: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
6a90: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
6aa0: 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20  ST){.    /* Did 
6ab0: 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  we have an exclu
6ac0: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
6ad0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
6ae0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
6af0: 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
6b00: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
6b10: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
6b20: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20  )SHARED_SIZE);. 
6b30: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
6b40: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  l.bExclusive = F
6b50: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
6b60: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
6b70: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
6b80: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
6b90: 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RUE;.    }..    
6ba0: 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68  /* Did we just h
6bb0: 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ave a reader loc
6bc0: 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  k? */.    else i
6bd0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
6be0: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
6bf0: 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
6c00: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
6c10: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
6c20: 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62  ED_SIZE || nNumb
6c30: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
6c40: 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20  kLow == 1);.    
6c50: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
6c60: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
6c70: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
6c80: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  al.nReaders == 0
6c90: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
6ca0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
6cb0: 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  >nReaders --;.  
6cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74      }.      bRet
6cd0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
6ce0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65  }.  }..  /* Rele
6cf0: 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20  asing a pending 
6d00: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
6d10: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
6d20: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
6d30: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
6d40: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
6d50: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
6d60: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
6d70: 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
6d80: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
6d90: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
6da0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
6db0: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
6dc0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
6dd0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
6de0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
6df0: 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
6e00: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
6e10: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
6e20: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
6e30: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26  )RESERVED_BYTE &
6e40: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
6e50: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
6e60: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
6e70: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
6e80: 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d) {.      pFile
6e90: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
6ea0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
6eb0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
6ec0: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
6ed0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
6ee0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
6ef0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
6f00: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
6f10: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
6f20: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
6f30: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
6f40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
6f50: 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20  FileEx() API of 
6f60: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
6f70: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
6f80: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78   winceLockFileEx
6f90: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
6fa0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  le,.  DWORD dwFl
6fb0: 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52  ags,.  DWORD dwR
6fc0: 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44  eserved,.  DWORD
6fd0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
6fe0: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
6ff0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
7000: 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50  ToLockHigh,.  LP
7010: 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65  OVERLAPPED lpOve
7020: 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e 55  rlapped.){.  UNU
7030: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
7040: 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e 55  Reserved);.  UNU
7050: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
7060: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
7070: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20 49  ckHigh);..  /* I
7080: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e  f the caller wan
7090: 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61 64  ts a shared read
70a0: 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74   lock, forward t
70b0: 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f  his call.  ** to
70c0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a   winceLockFile *
70d0: 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61  /.  if (lpOverla
70e0: 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20  pped->Offset == 
70f0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
7100: 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77 46  RST &&.      dwF
7110: 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20  lags == 1 &&.   
7120: 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65     nNumberOfByte
7130: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
7140: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
7150: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  ){.    return wi
7160: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69  nceLockFile(phFi
7170: 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
7180: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
7190: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
71a0: 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74  }./*.** End of t
71b0: 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20  he special code 
71c0: 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a  for wince.******
71d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
71f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7210: 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
7220: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
7230: 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  CE */../********
7240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7280: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  *****.** The nex
7290: 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  t group of routi
72a0: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
72b0: 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70  e I/O methods sp
72c0: 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
72d0: 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
72e0: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a  hods object..***
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
7340: 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f  .** Some microso
7350: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
7360: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
7370: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
7380: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
7390: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
73a0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
73b0: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
73c0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
73d0: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72  ** Move the curr
73e0: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
73f0: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
7400: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
7410: 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
7420: 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73   to offset iOffs
7430: 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  et within the fi
7440: 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
7450: 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a  l, return 0. .**
7460: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
7470: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
7480: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
7490: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
74a0: 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28  int seekWinFile(
74b0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
74c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
74d0: 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75  ffset){.  LONG u
74e0: 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  pperBits;       
74f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73            /* Mos
7500: 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
7510: 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
7520: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
7530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7540: 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20    /* Least sig. 
7550: 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
7560: 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44  ffset */.  DWORD
7570: 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20   dwRet;         
7580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
7590: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
75a0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
75b0: 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74 73   */..  upperBits
75c0: 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
75d0: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
75e0: 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
75f0: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
7600: 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
7610: 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
7620: 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
7630: 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
7640: 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
7650: 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  word .  ** conta
7660: 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20  ining the lower 
7670: 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e  32-bits of the n
7680: 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20  ew file-offset. 
7690: 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c  Or, if it fails,
76a0: 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  .  ** it returns
76b0: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
76c0: 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76  E_POINTER. Howev
76d0: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
76e0: 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41  MSDN, .  ** INVA
76f0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
7700: 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
7710: 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
7720: 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
7730: 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
7740: 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  er an error has 
7750: 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65 64  actually occured
7760: 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63  , it is also nec
7770: 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a  essary to call .
7780: 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f    ** GetLastErro
7790: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65  r()..  */.  dwRe
77a0: 74 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  t = SetFilePoint
77b0: 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77  er(pFile->h, low
77c0: 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69  erBits, &upperBi
77d0: 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b  ts, FILE_BEGIN);
77e0: 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49  .  if( (dwRet==I
77f0: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
7800: 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61  POINTER && GetLa
7810: 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52  stError()!=NO_ER
7820: 52 4f 52 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ROR) ){.    pFil
7830: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
7840: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
7850: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
7860: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
7870: 2c 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c  , "seekWinFile",
7880: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
7890: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
78a0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
78b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
78c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  file..**.** It i
78d0: 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20  s reported that 
78e0: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c  an attempt to cl
78f0: 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67  ose a handle mig
7900: 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ht sometimes.** 
7910: 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61  fail.  This is a
7920: 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62   very unreasonab
7930: 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 77  le result, but w
7940: 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69  indows is notori
7950: 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67  ous.** for being
7960: 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f   unreasonable so
7970: 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20   I do not doubt 
7980: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61  that it might ha
7990: 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65  ppen.  If.** the
79a0: 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65   close fails, we
79b0: 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d   pause for 100 m
79c0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
79d0: 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a  try again.  As.*
79e0: 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f  * many as MX_CLO
79f0: 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d  SE_ATTEMPT attem
7a00: 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  pts to close the
7a10: 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65   handle are made
7a20: 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e   before.** givin
7a30: 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  g up and returni
7a40: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
7a50: 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45  #define MX_CLOSE
7a60: 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69  _ATTEMPT 3.stati
7a70: 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73  c int winClose(s
7a80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
7a90: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20  {.  int rc, cnt 
7aa0: 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  = 0;.  winFile *
7ab0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
7ac0: 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
7ad0: 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
7ae0: 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
7af0: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
7b00: 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70  ("CLOSE %d\n", p
7b10: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b  File->h));.  do{
7b20: 0a 20 20 20 20 72 63 20 3d 20 43 6c 6f 73 65 48  .    rc = CloseH
7b30: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
7b40: 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
7b50: 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
7b60: 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
7b70: 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
7b80: 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
7b90: 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
7ba0: 54 54 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70  TTEMPT && (Sleep
7bb0: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
7bc0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7bd0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
7be0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
7bf0: 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
7c00: 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
7c10: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
7c20: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
7c30: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
7c40: 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
7c50: 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28      DeleteFileW(
7c60: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
7c70: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
7c80: 20 20 26 26 20 47 65 74 46 69 6c 65 41 74 74 72    && GetFileAttr
7c90: 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a  ibutesW(pFile->z
7ca0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d  DeleteOnClose)!=
7cb0: 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20  0xffffffff .    
7cc0: 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
7cd0: 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
7ce0: 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
7cf0: 20 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b       Sleep(100);
7d00: 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
7d10: 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
7d20: 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
7d30: 20 20 20 20 66 72 65 65 28 70 46 69 6c 65 2d 3e      free(pFile->
7d40: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
7d50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
7d60: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
7d70: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
7d80: 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66  , rc ? "ok" : "f
7d90: 61 69 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e  ailed"));.  Open
7da0: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
7db0: 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
7dc0: 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
7dd0: 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
7de0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
7df0: 45 2c 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70  E, "winClose", p
7e00: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
7e10: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
7e20: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
7e30: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
7e40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
7e50: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
7e60: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
7e70: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
7e80: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
7e90: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
7ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7eb0: 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
7ec0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
7ed0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
7ee0: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
7ef0: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
7f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
7f10: 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
7f20: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
7f30: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7f50: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
7f60: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
7f70: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
7f80: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
7f90: 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
7fa0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 77  offset */.){.  w
7fb0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
7fc0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
7fd0: 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
7fe0: 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8000: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8010: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
8020: 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
8030: 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
8040: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8050: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8060: 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
8070: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
8080: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
8090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
80a0: 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
80b0: 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
80c0: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
80d0: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
80e0: 74 79 70 65 29 29 3b 0a 0a 20 20 69 66 28 20 73  type));..  if( s
80f0: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
8100: 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  , offset) ){.   
8110: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
8120: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
8130: 28 20 21 52 65 61 64 46 69 6c 65 28 70 46 69 6c  ( !ReadFile(pFil
8140: 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
8150: 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 20   &nRead, 0) ){. 
8160: 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72     if( retryIoer
8170: 72 28 26 6e 52 65 74 72 79 29 20 29 20 63 6f 6e  r(&nRetry) ) con
8180: 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
8190: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
81a0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
81b0: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
81c0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
81d0: 52 5f 52 45 41 44 2c 20 22 77 69 6e 52 65 61 64  R_READ, "winRead
81e0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
81f0: 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72  ;.  }.  logIoerr
8200: 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20  (nRetry);.  if( 
8210: 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74  nRead<(DWORD)amt
8220: 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   ){.    /* Unrea
8230: 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
8240: 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
8250: 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
8260: 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
8270: 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30  )pBuf)[nRead], 0
8280: 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20  , amt-nRead);.  
8290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
82a0: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
82b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
82c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
82d0: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
82e0: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
82f0: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
8300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
8310: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
8320: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
8330: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
8340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
8350: 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
8360: 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
8370: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8380: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
8390: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
83a0: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
83b0: 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
83c0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
83d0: 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8400: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
8410: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
8420: 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
8430: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
8440: 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
8450: 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
8460: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
8490: 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63   if error has oc
84a0: 63 75 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73  cured, else fals
84b0: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
84c0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
84d0: 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68  *)id;  /* File h
84e0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
84f0: 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
8500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8510: 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20  mber of retries 
8520: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d  */..  assert( am
8530: 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
8540: 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
8550: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
8560: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
8570: 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61  WRITE);.  Simula
8580: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
8590: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
85a0: 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  LL);..  OSTRACE(
85b0: 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d  ("WRITE %d lock=
85c0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
85d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
85e0: 29 29 3b 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b  ));..  rc = seek
85f0: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
8600: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
8610: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 61  ==0 ){.    u8 *a
8620: 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66  Rem = (u8 *)pBuf
8630: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
8640: 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
8650: 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  en */.    int nR
8660: 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20  em = amt;       
8670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8680: 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74  r of bytes yet t
8690: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
86a0: 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65      DWORD nWrite
86b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
86c0: 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74    /* Bytes writt
86d0: 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65  en by each Write
86e0: 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  File() call */..
86f0: 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
8700: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
8710: 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
8720: 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
8730: 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 20  &nWrite, 0) ){. 
8740: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
8750: 49 6f 65 72 72 28 26 6e 52 65 74 72 79 29 20 29  Ioerr(&nRetry) )
8760: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8780: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  }.      if( nWri
8790: 74 65 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  te<=0 ) break;. 
87a0: 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72       aRem += nWr
87b0: 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20  ite;.      nRem 
87c0: 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d  -= nWrite;.    }
87d0: 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20  .    if( nRem>0 
87e0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
87f0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
8800: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
8810: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
8820: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
8830: 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
8840: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
8850: 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
8860: 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
8870: 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
8880: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
8890: 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
88a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
88b0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
88c0: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
88d0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  (SQLITE_IOERR_WR
88e0: 49 54 45 2c 20 22 77 69 6e 57 72 69 74 65 22 2c  ITE, "winWrite",
88f0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
8900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67    }else{.    log
8910: 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
8920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
8930: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8940: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
8950: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
8960: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
8970: 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63  tic int winTrunc
8980: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
8990: 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
89a0: 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69  t64 nByte){.  wi
89b0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
89c0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
89d0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a   File handle obj
89e0: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
89f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8a10: 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  rn code for this
8a20: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
8a30: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
8a40: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ..  OSTRACE(("TR
8a50: 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e  UNCATE %d %lld\n
8a60: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  ", pFile->h, nBy
8a70: 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  te));.  Simulate
8a80: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
8a90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
8aa0: 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  CATE);..  /* If 
8ab0: 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
8ac0: 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
8ad0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
8ae0: 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
8af0: 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
8b00: 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
8b10: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
8b20: 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
8b30: 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
8b40: 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
8b50: 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
8b60: 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
8b70: 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
8b80: 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
8b90: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
8ba0: 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >szChunk ){.    
8bb0: 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
8bc0: 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
8bd0: 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
8be0: 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
8bf0: 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
8c00: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
8c10: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
8c20: 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
8c30: 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
8c40: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
8c50: 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
8c60: 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
8c70: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
8c80: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
8c90: 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 77 69 6e  R_TRUNCATE, "win
8ca0: 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c  Truncate1", pFil
8cb0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
8cc0: 73 65 20 69 66 28 20 30 3d 3d 53 65 74 45 6e 64  se if( 0==SetEnd
8cd0: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
8ce0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
8cf0: 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
8d00: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
8d10: 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
8d20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
8d30: 4e 43 41 54 45 2c 20 22 77 69 6e 54 72 75 6e 63  NCATE, "winTrunc
8d40: 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
8d50: 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  ath);.  }..  OST
8d60: 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
8d70: 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70  %d %lld %s\n", p
8d80: 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
8d90: 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
8da0: 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
8db0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
8dc0: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
8dd0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
8de0: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
8df0: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
8e00: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
8e10: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
8e20: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
8e30: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
8e40: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
8e50: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
8e60: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
8e70: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
8e80: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
8e90: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
8ea0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
8eb0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
8ec0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
8ed0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
8ee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8ef0: 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
8f00: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
8f10: 61 67 73 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  ags){.#if !defin
8f20: 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
8f30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
8f40: 5f 53 59 4e 43 29 20 7c 7c 20 64 65 66 69 6e 65  _SYNC) || define
8f50: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
8f60: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
8f70: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
8f80: 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6c 73  .  BOOL rc;.#els
8f90: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
8fa0: 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
8fb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
8fc0: 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
8fd0: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
8fe0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
8ff0: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
9000: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
9010: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
9020: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
9030: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
9040: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
9050: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
9060: 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
9070: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
9080: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
9090: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
90a0: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
90b0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
90c0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
90d0: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
90e0: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
90f0: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
9100: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
9110: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
9120: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
9130: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
9140: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
9150: 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
9160: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
9170: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9180: 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
9190: 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
91a0: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
91b0: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
91c0: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
91d0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
91e0: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
91f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
9200: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
9210: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
9220: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
9230: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
9240: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
9250: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
9260: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
9270: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
9280: 63 20 3d 20 46 6c 75 73 68 46 69 6c 65 42 75 66  c = FlushFileBuf
9290: 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
92a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
92b0: 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
92c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
92d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
92e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
92f0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9300: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
9310: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
9320: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
9330: 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 77 69 6e  OERR_FSYNC, "win
9340: 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
9350: 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
9360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
9370: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
9380: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
9390: 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
93a0: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
93b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
93c0: 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
93d0: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f  4 *pSize){.  DWO
93e0: 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20  RD upperBits;.  
93f0: 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
9400: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
9410: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
9420: 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 3b  ;.  DWORD error;
9430: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
9440: 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
9450: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
9460: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
9470: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
9480: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69   GetFileSize(pFi
9490: 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  le->h, &upperBit
94a0: 73 29 3b 0a 20 20 69 66 28 20 20 20 28 6c 6f 77  s);.  if(   (low
94b0: 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
94c0: 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
94d0: 20 20 26 26 20 28 28 65 72 72 6f 72 20 3d 20 47    && ((error = G
94e0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20 21  etLastError()) !
94f0: 3d 20 4e 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20  = NO_ERROR) ).  
9500: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9510: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
9520: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
9530: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
9540: 45 52 52 5f 46 53 54 41 54 2c 20 22 77 69 6e 46  ERR_FSTAT, "winF
9550: 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
9560: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a  >zPath);.  }.  *
9570: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
9580: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
9590: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
95a0: 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53  Bits;.  return S
95b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
95c0: 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
95d0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
95e0: 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
95f0: 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
9600: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
9610: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
9620: 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
9630: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
9640: 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
9650: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
9660: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
9670: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
9680: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
9690: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
96a0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
96b0: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
96c0: 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n95 or WinNT..*/
96d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52  .static int getR
96e0: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
96f0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
9700: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
9710: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
9720: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c  ED ovlp;.    ovl
9730: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  p.Offset = SHARE
9740: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c  D_FIRST;.    ovl
9750: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30  p.OffsetHigh = 0
9760: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e  ;.    ovlp.hEven
9770: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d  t = 0;.    res =
9780: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c   LockFileEx(pFil
9790: 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46  e->h, LOCKFILE_F
97a0: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c  AIL_IMMEDIATELY,
97b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
97c0: 20 20 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f        0, SHARED_
97d0: 53 49 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  SIZE, 0, &ovlp);
97e0: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
97f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
9800: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
9810: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
9820: 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53  cuted. .*/.#if S
9830: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
9840: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  0.  }else{.    i
9850: 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
9860: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
9870: 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
9880: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
9890: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
98a0: 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
98b0: 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
98c0: 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
98d0: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69  s = LockFile(pFi
98e0: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
98f0: 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
9900: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
9910: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
9920: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
9930: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
9940: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
9950: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
9960: 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
9970: 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
9980: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
9990: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
99a0: 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
99b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c  /.static int unl
99c0: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  ockReadLock(winF
99d0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
99e0: 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73  nt res;.  if( is
99f0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
9a00: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69  = UnlockFile(pFi
9a10: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
9a20: 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
9a30: 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54  IZE, 0);./* isNT
9a40: 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
9a50: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
9a60: 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
9a70: 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
9a80: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
9a90: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
9aa0: 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c  e{.    res = Unl
9ab0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
9ac0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
9ad0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
9ae0: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
9af0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
9b00: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 47 65 74  f( res==0 && Get
9b10: 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52  LastError()!=ERR
9b20: 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 20 29 7b  OR_NOT_LOCKED ){
9b30: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
9b40: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
9b50: 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
9b60: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
9b70: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 75 6e  OERR_UNLOCK, "un
9b80: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
9b90: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
9ba0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
9bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
9bc0: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
9bd0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
9be0: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
9bf0: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
9c00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
9c10: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
9c20: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
9c30: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
9c40: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
9c50: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
9c60: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
9c70: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
9c80: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
9c90: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
9ca0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
9cb0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
9cc0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
9cd0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
9ce0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
9cf0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
9d00: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
9d10: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
9d20: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
9d30: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
9d40: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
9d50: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
9d60: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
9d70: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
9d80: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
9d90: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
9da0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
9db0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
9dc0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
9dd0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
9de0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
9df0: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
9e00: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
9e10: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
9e20: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
9e30: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
9e40: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
9e50: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
9e60: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
9e70: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
9e80: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
9e90: 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
9ea0: 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
9eb0: 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
9ec0: 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
9ed0: 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
9ee0: 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
9ef0: 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
9f00: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
9f10: 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
9f20: 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
9f30: 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
9f40: 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
9f50: 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
9f60: 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
9f70: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
9f80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
9f90: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
9fa0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9fb0: 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
9fc0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
9fd0: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
9fe0: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
9ff0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
a000: 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a windows lock
a010: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
a020: 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
a030: 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
a040: 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
a050: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
a060: 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
a070: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
a080: 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
a090: 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
a0a0: 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
a0b0: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
a0c0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
a0d0: 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72  *)id;.  DWORD er
a0e0: 72 6f 72 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  ror = NO_ERROR;.
a0f0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
a100: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
a110: 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25  LOCK %d %d was %
a120: 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  d(%d)\n",.      
a130: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
a140: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
a150: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
a160: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
a170: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
a180: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
a190: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
a1a0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
a1b0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
a1c0: 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
a1d0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
a1e0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
a1f0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
a200: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
a210: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
a220: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
a230: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
a240: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
a250: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
a260: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
a270: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
a280: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
a290: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
a2a0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
a2b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
a2c0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
a2d0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
a2e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
a2f0: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
a300: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
a310: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
a320: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
a330: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
a340: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
a350: 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
a360: 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
a370: 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
a380: 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
a390: 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
a3a0: 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
a3b0: 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
a3c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
a3d0: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
a3e0: 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
a3f0: 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
a400: 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
a410: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
a420: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
a430: 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
a440: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
a450: 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
a460: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
a470: 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
a480: 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
a490: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
a4a0: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
a4b0: 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
a4c0: 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
a4d0: 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46   && (res = LockF
a4e0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
a4f0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
a500: 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
a510: 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
a520: 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
a530: 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70  ing lock.  The p
a540: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68  ending lock migh
a550: 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65  t be.      ** he
a560: 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65  ld by another re
a570: 61 64 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f  ader process who
a580: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74   will release it
a590: 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20   momentarily..  
a5a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54      */.      OST
a5b0: 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74  RACE(("could not
a5c0: 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c   get a PENDING l
a5d0: 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20  ock. cnt=%d\n", 
a5e0: 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 53 6c 65  cnt));.      Sle
a5f0: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
a600: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
a610: 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
a620: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 65 72 72  res ){.      err
a630: 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
a640: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
a650: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
a660: 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
a670: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
a680: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
a690: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
a6a0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
a6b0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
a6c0: 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
a6d0: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
a6e0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
a6f0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
a700: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
a710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72 72  }else{.      err
a720: 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
a730: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
a740: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
a750: 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
a760: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
a770: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
a780: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
a790: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
a7a0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a7b0: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
a7c0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
a7d0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
a7e0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
a7f0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
a800: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
a810: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
a820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
a830: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
a840: 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
a850: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
a860: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
a870: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
a880: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
a890: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
a8a0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
a8b0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
a8c0: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
a8d0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
a8e0: 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
a8f0: 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
a900: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
a910: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
a920: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
a930: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
a940: 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
a950: 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f  ;.    res = unlo
a960: 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
a970: 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
a980: 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64  "unreadlock = %d
a990: 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20  \n", res));.    
a9a0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
a9b0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
a9c0: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
a9d0: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
a9e0: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
a9f0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
aa00: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
aa10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
aa20: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
aa30: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
aa40: 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64  RACE(("error-cod
aa50: 65 20 3d 20 25 64 5c 6e 22 2c 20 65 72 72 6f 72  e = %d\n", error
aa60: 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61  ));.      getRea
aa70: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
aa80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
aa90: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
aaa0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
aab0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
aac0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
aad0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
aae0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
aaf0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
ab00: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
ab10: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  D_LOCK ){.    Un
ab20: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
ab30: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
ab40: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
ab50: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
ab60: 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
ab70: 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
ab80: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
ab90: 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
aba0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
abb0: 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
abc0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
abd0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
abe0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
abf0: 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
ac00: 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69  K FAILED %d tryi
ac10: 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f  ng for %d but go
ac20: 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t %d\n", pFile->
ac30: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
ac40: 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
ac50: 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65  ype));.    pFile
ac60: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
ac70: 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ror;.    rc = SQ
ac80: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
ac90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
aca0: 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
acb0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
acc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
acd0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
ace0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
acf0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
ad00: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
ad10: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
ad20: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
ad30: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
ad40: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
ad50: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
ad60: 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
ad70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ad80: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
ad90: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
ada0: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
adb0: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
adc0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
add0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
ade0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
adf0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
ae00: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
ae10: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
ae20: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
ae30: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
ae40: 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
ae50: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
ae60: 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
ae70: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
ae80: 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
ae90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
aea0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
aeb0: 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70   rc = LockFile(p
aec0: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
aed0: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
aee0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
aef0: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65        UnlockFile
af00: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
af10: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
af20: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
af30: 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52   = !rc;.    OSTR
af40: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
af50: 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
af60: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
af70: 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
af80: 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
af90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
afa0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
afb0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
afc0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
afd0: 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
afe0: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
aff0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
b000: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
b010: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
b020: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
b030: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
b040: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
b050: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
b060: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
b070: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
b080: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
b090: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
b0a0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
b0b0: 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
b0c0: 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
b0d0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b0e0: 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
b0f0: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
b100: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
b110: 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
b120: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
b130: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
b140: 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
b150: 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
b160: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
b170: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
b180: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
b190: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
b1a0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
b1b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b1c0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
b1d0: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
b1e0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
b1f0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
b200: 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
b210: 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28  %d to %d was %d(
b220: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
b230: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
b240: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
b250: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
b260: 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a  aredLockByte));.
b270: 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
b280: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
b290: 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
b2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
b2b0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
b2c0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
b2d0: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
b2e0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  );.    if( lockt
b2f0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
b300: 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b   && !getReadLock
b310: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
b320: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
b330: 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
b340: 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
b350: 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
b360: 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
b370: 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
b380: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
b390: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
b3a0: 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 77 69 6e 55  RR_UNLOCK, "winU
b3b0: 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
b3c0: 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
b3d0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
b3e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
b3f0: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
b400: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
b410: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
b420: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
b430: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74  pe==NO_LOCK && t
b440: 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
b450: 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65   ){.    unlockRe
b460: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
b470: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
b480: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
b490: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
b4a0: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
b4b0: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
b4c0: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
b4d0: 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
b4e0: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
b4f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  c;.}../*.** Cont
b500: 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
b510: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
b520: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
b530: 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
b540: 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
b550: 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
b560: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
b570: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
b580: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  inFile*)id;.  sw
b590: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
b5a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
b5b0: 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
b5c0: 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
b5d0: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
b5e0: 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
b5f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b600: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
b610: 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
b620: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
b630: 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
b640: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
b650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b660: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
b670: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
b680: 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
b690: 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
b6a0: 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
b6b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b6c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
b6d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6e0: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
b6f0: 20 7b 0a 20 20 20 20 20 20 77 69 6e 46 69 6c 65   {.      winFile
b700: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
b710: 6c 65 2a 29 69 64 3b 0a 20 20 20 20 20 20 73 71  le*)id;.      sq
b720: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
b730: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  z;.      int rc 
b740: 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64  = winFileSize(id
b750: 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20  , &oldSz);.     
b760: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
b780: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53  lite3_int64 newS
b790: 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e  z = *(sqlite3_in
b7a0: 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  t64*)pArg;.     
b7b0: 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64     if( newSz>old
b7c0: 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Sz ){.          
b7d0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
b7e0: 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
b7f0: 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
b800: 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
b810: 0a 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c  .          Simul
b820: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b830: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (0);.        }. 
b840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
b850: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
b860: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
b870: 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
b880: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 50 65   {.      int bPe
b890: 72 73 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70  rsist = *(int*)p
b8a0: 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 62  Arg;.      if( b
b8b0: 50 65 72 73 69 73 74 3c 30 20 29 7b 0a 20 20 20  Persist<0 ){.   
b8c0: 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
b8d0: 20 3d 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69   = pFile->bPersi
b8e0: 73 74 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c  stWal;.      }el
b8f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  se{.        pFil
b900: 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c 20 3d  e->bPersistWal =
b910: 20 62 50 65 72 73 69 73 74 21 3d 30 3b 0a 20 20   bPersist!=0;.  
b920: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
b930: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b940: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
b950: 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f  ITE_FCNTL_SYNC_O
b960: 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20 20  MITTED: {.      
b970: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b990: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
b9a0: 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
b9b0: 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
b9c0: 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
b9d0: 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
b9e0: 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72         win32Ioer
b9f0: 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20  rRetry = a[0];. 
ba00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ba10: 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32      a[0] = win32
ba20: 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20  IoerrRetry;.    
ba30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b    }.      if( a[
ba40: 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1]>0 ){.        
ba50: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
ba60: 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20  elay = a[1];.   
ba70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ba80: 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f    a[1] = win32Io
ba90: 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20  errRetryDelay;. 
baa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
bab0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
bac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bad0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
bae0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
baf0: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
bb00: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
bb10: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
bb20: 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
bb30: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
bb40: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
bb50: 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
bb60: 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
bb70: 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
bb80: 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
bb90: 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
bba0: 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
bbb0: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
bbc0: 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
bbd0: 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
bbe0: 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
bbf0: 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
bc00: 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
bc10: 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
bc20: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
bc30: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
bc40: 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
bc50: 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
bc60: 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
bc70: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
bc80: 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
bc90: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
bca0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  {.  assert( id!=
bcb0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  0 );.  return (i
bcc0: 6e 74 29 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  nt)(((winFile*)i
bcd0: 64 29 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  d)->sectorSize);
bce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bcf0: 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76   a vector of dev
bd00: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
bd10: 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
bd20: 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  nt winDeviceChar
bd30: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
bd40: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
bd50: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
bd60: 52 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(id);.  return 
bd70: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
bd80: 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
bd90: 45 4e 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  EN;.}..#ifndef S
bda0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
bdb0: 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  /* .** Windows w
bdc0: 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
bdd0: 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
bde0: 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
bdf0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
be00: 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
be10: 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
be20: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
be30: 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
be40: 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
be50: 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
be60: 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
be70: 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53  SYSTEM_INFO winS
be80: 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ysInfo;../*.** H
be90: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
bea0: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
beb0: 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
bec0: 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
bed0: 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
bee0: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
bef0: 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
bf00: 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
bf10: 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c  y .** this file,
bf20: 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
bf30: 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d  y be shared by m
bf40: 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
bf50: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
bf60: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
bf70: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
bf80: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
bf90: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
bfa0: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
bfb0: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
bfc0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
bfd0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
bfe0: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
bff0: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
c000: 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
c010: 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
c020: 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
c030: 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
c040: 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
c050: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
c060: 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
c070: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
c080: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
c090: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
c0a0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
c0b0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
c0c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
c0d0: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
c0e0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
c0f0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
c100: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
c110: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
c120: 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
c130: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c140: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
c150: 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
c160: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
c170: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c180: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
c190: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
c1a0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
c1b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c1c0: 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
c1d0: 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
c1e0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
c1f0: 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
c200: 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
c210: 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
c220: 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
c230: 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
c240: 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
c250: 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
c260: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
c270: 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
c280: 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
c290: 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
c2a0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
c2b0: 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
c2c0: 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
c2d0: 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
c2e0: 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
c2f0: 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
c300: 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
c310: 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
c320: 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
c330: 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
c340: 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
c350: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
c360: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
c370: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
c380: 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
c390: 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
c3a0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
c3b0: 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
c3c0: 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
c3d0: 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
c3e0: 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
c3f0: 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
c400: 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
c410: 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
c420: 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
c430: 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
c440: 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
c450: 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
c460: 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
c470: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
c480: 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
c490: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
c4a0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
c4b0: 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
c4c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c4d0: 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
c4e0: 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
c4f0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
c500: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
c510: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
c520: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
c530: 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
c540: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
c550: 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
c560: 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
c570: 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c590: 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
c5a0: 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
c5b0: 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c5d0: 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
c5e0: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
c5f0: 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
c600: 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
c610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c620: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
c630: 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
c640: 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
c650: 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
c660: 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
c670: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
c680: 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
c690: 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
c6a0: 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
c6b0: 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
c6e0: 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
c6f0: 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
c700: 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
c710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c720: 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
c730: 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
c740: 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
c750: 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
c760: 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
c770: 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
c780: 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
c790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
c7a0: 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68  EBUG.  u8 nextSh
c7b0: 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
c7c0: 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
c7d0: 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
c7e0: 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
c7f0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
c800: 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
c810: 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
c820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
c830: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
c840: 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
c850: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
c860: 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
c870: 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
c880: 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
c890: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
c8a0: 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
c8b0: 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
c8c0: 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
c8d0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
c8e0: 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
c8f0: 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
c900: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
c910: 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
c920: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
c930: 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
c940: 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
c950: 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
c960: 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
c970: 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
c980: 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
c990: 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
c9a0: 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
c9b0: 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
c9c0: 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
c9d0: 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
c9e0: 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
c9f0: 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
ca00: 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
ca10: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
ca20: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
ca30: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
ca40: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
ca50: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
ca60: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
ca70: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
ca80: 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
ca90: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
caa0: 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
cab0: 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
cac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
cad0: 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
cae0: 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
caf0: 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
cb00: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
cb10: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
cb20: 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
cb30: 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb50: 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
cb60: 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
cb70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
cb80: 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
cbb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
cbc0: 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  its winShmNode *
cbd0: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
cbe0: 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
cbf0: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
cc00: 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
cc10: 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
cc20: 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
cc30: 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73  )        /* firs
cc40: 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
cc50: 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44  define WIN_SHM_D
cc60: 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42  MS    (WIN_SHM_B
cc70: 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
cc80: 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
cc90: 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
cca0: 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72  ** Apply advisor
ccb0: 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
ccc0: 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  n bytes beginnin
ccd0: 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64  g at ofst..*/.#d
cce0: 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b  efine _SHM_UNLCK
ccf0: 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    1.#define _SHM
cd00: 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
cd10: 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a  e _SHM_WRLCK  3.
cd20: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
cd30: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77  mSystemLock(.  w
cd40: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65  inShmNode *pFile
cd50: 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ,    /* Apply lo
cd60: 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
cd70: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
cd80: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
cd90: 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
cda0: 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c    /* _SHM_UNLCK,
cdb0: 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20   _SHM_RDLCK, or 
cdc0: 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  _SHM_WRLCK */.  
cdd0: 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
cde0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
cdf0: 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
ce00: 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
ce10: 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
ce20: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
ce30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
ce40: 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
ce50: 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52  ock */.){.  OVER
ce60: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44  LAPPED ovlp;.  D
ce70: 57 4f 52 44 20 64 77 46 6c 61 67 73 3b 0a 20 20  WORD dwFlags;.  
ce80: 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
ce90: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
cea0: 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55  code form Lock/U
ceb0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f  nlockFileEx() */
cec0: 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
ced0: 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
cee0: 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
cef0: 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
cf00: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
cf10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cf20: 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
cf30: 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d   || pFile->nRef=
cf40: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  =0 );..  /* Init
cf50: 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
cf60: 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
cf70: 0a 20 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  .  dwFlags = LOC
cf80: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
cf90: 49 41 54 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f  IATELY;.  if( lo
cfa0: 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57  ckType == _SHM_W
cfb0: 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c  RLCK ) dwFlags |
cfc0: 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  = LOCKFILE_EXCLU
cfd0: 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65  SIVE_LOCK;..  me
cfe0: 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
cff0: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
d000: 29 29 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ));.  ovlp.Offse
d010: 74 20 3d 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20  t = ofst;..  /* 
d020: 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
d030: 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
d040: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
d050: 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
d060: 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
d070: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69  UnlockFileEx(pFi
d080: 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20  le->hFile.h, 0, 
d090: 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29  nByte, 0, &ovlp)
d0a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d0b0: 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70  c = LockFileEx(p
d0c0: 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64  File->hFile.h, d
d0d0: 77 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74 65  wFlags, 0, nByte
d0e0: 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  , 0, &ovlp);.  }
d0f0: 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30  .  .  if( rc!= 0
d100: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
d110: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
d120: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
d130: 45 72 72 6e 6f 20 3d 20 20 47 65 74 4c 61 73 74  Errno =  GetLast
d140: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
d150: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
d160: 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
d170: 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25  SHM-LOCK %d %s %
d180: 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20  s 0x%08lx\n", . 
d190: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
d1a0: 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
d1b0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
d1c0: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
d1d0: 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  led",.          
d1e0: 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f   lockType==_SHM_
d1f0: 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46  UNLCK ? "UnlockF
d200: 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69  ileEx" : "LockFi
d210: 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20  leEx",.         
d220: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d230: 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  no));..  return 
d240: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
d250: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
d260: 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73  VFS methods */.s
d270: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
d280: 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63  n(sqlite3_vfs*,c
d290: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
d2a0: 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74  e3_file*,int,int
d2b0: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
d2c0: 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  inDelete(sqlite3
d2d0: 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61  _vfs *,const cha
d2e0: 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  r*,int);../*.** 
d2f0: 50 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d  Purge the winShm
d300: 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
d310: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
d320: 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65  h winShmNode.nRe
d330: 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
d340: 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
d350: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
d360: 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
d370: 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
d380: 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
d390: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
d3a0: 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
d3b0: 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28  oid winShmPurge(
d3c0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
d3d0: 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  s, int deleteFla
d3e0: 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  g){.  winShmNode
d3f0: 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e   **pp;.  winShmN
d400: 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62  ode *p;.  BOOL b
d410: 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69  Rc;.  assert( wi
d420: 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
d430: 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68  );.  pp = &winSh
d440: 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  mNodeList;.  whi
d450: 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30  le( (p = *pp)!=0
d460: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
d470: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
d480: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
d490: 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69   p->mutex ) sqli
d4a0: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
d4b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
d4c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
d4d0: 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
d4e0: 20 20 20 20 20 62 52 63 20 3d 20 55 6e 6d 61 70       bRc = Unmap
d4f0: 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
d500: 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
d510: 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
d520: 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d  ("SHM-PURGE pid-
d530: 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d  %d unmap region=
d540: 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
d550: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
d560: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
d570: 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
d580: 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
d590: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
d5a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20  ));.        bRc 
d5b0: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d  = CloseHandle(p-
d5c0: 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70  >aRegion[i].hMap
d5d0: 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
d5e0: 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70  CE(("SHM-PURGE p
d5f0: 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67 69  id-%d close regi
d600: 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  on=%d %s\n",.   
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
d620: 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  nt)GetCurrentPro
d630: 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20  cessId(), i,.   
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
d650: 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
d660: 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ed"));.      }. 
d670: 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c       if( p->hFil
d680: 65 2e 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48  e.h != INVALID_H
d690: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
d6a0: 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
d6b0: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
d6c0: 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
d6d0: 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
d6e0: 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
d6f0: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d700: 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
d710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d720: 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
d730: 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
d740: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
d750: 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
d760: 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
d770: 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
d780: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
d790: 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
d7a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
d7b0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
d7c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d7d0: 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  ->aRegion);.    
d7e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d7f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
d800: 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65      pp = &p->pNe
d810: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
d820: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
d830: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
d840: 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
d850: 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  th database file
d860: 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   pDbFd..**.** Wh
d870: 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
d880: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
d890: 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
d8a0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
d8b0: 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
d8c0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
d8d0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
d8e0: 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
d8f0: 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
d900: 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
d910: 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
d920: 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
d930: 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
d940: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d950: 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  t winOpenSharedM
d960: 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70  emory(winFile *p
d970: 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
d980: 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
d990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d9a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
d9b0: 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
d9c0: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
d9d0: 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e *pShmNode = 0;
d9e0: 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
d9f0: 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
da00: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
da30: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74  ult code */.  st
da40: 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
da50: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
da60: 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
da70: 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ted winShmNode *
da80: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
dab0: 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73  f zName in bytes
dac0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dad0: 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
dae0: 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69      /* Not previ
daf0: 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a  ously opened */.
db00: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
db10: 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
db20: 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a   sqlite3_shm obj
db30: 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75  ect.  Also specu
db40: 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c  latively.  ** al
db50: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
db60: 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64   a new winShmNod
db70: 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a  e and filename..
db80: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
db90: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
dba0: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
dbb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
dbc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
dbd0: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
dbe0: 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d  (*p));.  nName =
dbf0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
dc00: 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
dc10: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
dc20: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
dc30: 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61  *pShmNode) + nNa
dc40: 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20 69 66 28  me + 15 );.  if(
dc50: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
dc60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
dc70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
dc80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
dc90: 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
dca0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
dcb0: 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d    pNew->zFilenam
dcc0: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
dcd0: 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  [1];.  sqlite3_s
dce0: 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35  nprintf(nName+15
dcf0: 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
dd00: 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62  e, "%s-shm", pDb
dd10: 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71  Fd->zPath);.  sq
dd20: 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
dd30: 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70  (pDbFd->zPath, p
dd40: 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  New->zFilename);
dd50: 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20   ..  /* Look to 
dd60: 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
dd70: 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53  an existing winS
dd80: 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20  hmNode that can 
dd90: 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66  be used..  ** If
dda0: 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e   no matching win
ddb0: 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c  ShmNode currentl
ddc0: 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65  y exists, create
ddd0: 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f   a new one..  */
dde0: 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
ddf0: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68  tex();.  for(pSh
de00: 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f  mNode = winShmNo
de10: 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65  deList; pShmNode
de20: 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e  ; pShmNode=pShmN
de30: 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ode->pNext){.   
de40: 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20   /* TBD need to 
de50: 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74  come up with bet
de60: 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20  ter match here. 
de70: 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20   Perhaps.    ** 
de80: 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48  use FILE_ID_BOTH
de90: 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74  _DIR_INFO Struct
dea0: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
deb0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
dec0: 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  mp(pShmNode->zFi
ded0: 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46  lename, pNew->zF
dee0: 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ilename)==0 ) br
def0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  eak;.  }.  if( p
df00: 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73  ShmNode ){.    s
df10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
df20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
df30: 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b  pShmNode = pNew;
df40: 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20  .    pNew = 0;. 
df50: 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26     ((winFile*)(&
df60: 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29  pShmNode->hFile)
df70: 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  )->h = INVALID_H
df80: 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20  ANDLE_VALUE;.   
df90: 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74   pShmNode->pNext
dfa0: 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73   = winShmNodeLis
dfb0: 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64  t;.    winShmNod
dfc0: 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65  eList = pShmNode
dfd0: 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  ;..    pShmNode-
dfe0: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
dff0: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
e000: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
e010: 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
e020: 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
e030: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e040: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
e050: 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
e060: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
e070: 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
e080: 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
e090: 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
e0a0: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
e0b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
e0c0: 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
e0d0: 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
e0e0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
e0f0: 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
e100: 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
e110: 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
e120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e130: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
e140: 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
e150: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
e160: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
e170: 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  /* Mode flags */
e180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e190: 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51    0);.    if( SQ
e1a0: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
e1b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e1c0: 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
e1d0: 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
e1e0: 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
e1f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
e200: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
e210: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
e220: 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
e230: 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
e240: 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
e250: 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
e260: 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a  length. .    */.
e270: 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79      if( winShmSy
e280: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
e290: 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57  e, _SHM_WRLCK, W
e2a0: 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IN_SHM_DMS, 1)==
e2b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e2c0: 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
e2d0: 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
e2e0: 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
e2f0: 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  File, 0);.      
e300: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e310: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
e320: 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
e330: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
e340: 45 4e 2c 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22  EN, "winOpenShm"
e350: 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
e360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e370: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e380: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
e390: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
e3a0: 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
e3b0: 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
e3c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
e3d0: 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
e3e0: 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
e3f0: 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
e400: 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
e410: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
e420: 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
e430: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
e440: 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
e450: 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
e460: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
e470: 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
e480: 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
e490: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
e4a0: 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
e4b0: 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
e4c0: 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
e4d0: 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
e4e0: 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
e4f0: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
e500: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
e510: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
e520: 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
e530: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
e540: 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
e550: 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
e560: 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
e570: 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
e580: 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
e590: 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
e5a0: 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
e5b0: 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
e5c0: 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
e5d0: 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
e5e0: 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
e5f0: 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
e600: 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
e610: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
e620: 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
e630: 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
e640: 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
e650: 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
e660: 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
e670: 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
e680: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
e690: 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
e6a0: 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
e6b0: 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
e6c0: 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
e6d0: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
e6e0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
e6f0: 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
e700: 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
e710: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
e720: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
e730: 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
e740: 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
e750: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
e760: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
e770: 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
e780: 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
e790: 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
e7a0: 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
e7b0: 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
e7c0: 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
e7d0: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
e7e0: 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
e7f0: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
e800: 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
e810: 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
e820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
e830: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
e840: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
e850: 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
e860: 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
e870: 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
e880: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
e890: 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
e8a0: 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
e8b0: 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
e8c0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
e8d0: 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
e8e0: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
e8f0: 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
e900: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
e910: 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
e920: 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
e930: 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
e940: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
e950: 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
e960: 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
e970: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
e980: 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
e990: 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
e9a0: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
e9b0: 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
e9c0: 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
e9d0: 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
e9e0: 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
e9f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
ea00: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
ea10: 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
ea20: 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
ea30: 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
ea40: 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
ea50: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
ea60: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ea70: 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
ea80: 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
ea90: 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
eaa0: 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
eab0: 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
eac0: 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
ead0: 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
eae0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
eaf0: 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
eb00: 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
eb10: 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
eb20: 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
eb30: 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
eb40: 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
eb50: 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
eb60: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
eb70: 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
eb80: 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
eb90: 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
eba0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ebb0: 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
ebc0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
ebd0: 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
ebe0: 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
ebf0: 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
ec00: 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
ec10: 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
ec20: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
ec30: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
ec40: 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
ec50: 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
ec60: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
ec70: 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
ec80: 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
ec90: 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
eca0: 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
ecb0: 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
ecc0: 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
ecd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ece0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
ecf0: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
ed00: 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
ed10: 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
ed20: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
ed30: 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
ed40: 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
ed50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
ed60: 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
ed70: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
ed80: 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eda0: 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
edb0: 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
edc0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ede0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
edf0: 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
ee00: 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
ee10: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
ee20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
ee30: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
ee40: 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
ee50: 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
ee60: 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
ee70: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
ee80: 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
ee90: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
eea0: 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
eeb0: 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
eec0: 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
eed0: 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
eee0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
eef0: 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
ef20: 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
ef30: 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
ef40: 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
ef50: 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
ef60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
ef90: 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efc0: 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
efd0: 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
efe0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
eff0: 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
f000: 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
f010: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
f020: 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
f030: 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
f040: 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
f050: 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
f060: 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
f070: 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
f080: 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
f090: 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
f0a0: 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
f0b0: 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
f0c0: 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
f0d0: 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
f0e0: 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
f0f0: 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
f100: 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
f110: 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
f120: 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
f130: 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
f140: 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
f150: 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
f160: 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
f170: 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
f180: 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
f190: 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
f1a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f1b0: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
f1c0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
f1d0: 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
f1e0: 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
f1f0: 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
f200: 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
f210: 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
f220: 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
f230: 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
f240: 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
f250: 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
f260: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
f270: 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
f280: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
f290: 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
f2a0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
f2b0: 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
f2c0: 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
f2d0: 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
f2e0: 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
f2f0: 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
f300: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
f310: 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
f320: 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
f330: 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
f340: 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
f350: 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
f360: 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
f370: 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
f380: 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
f390: 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
f3a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f3b0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
f3c0: 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
f3d0: 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
f3e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f3f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
f400: 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
f410: 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
f420: 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
f430: 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
f440: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
f450: 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
f460: 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
f470: 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
f480: 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
f490: 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
f4a0: 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
f4b0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
f4c0: 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
f4d0: 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
f4e0: 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
f4f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
f500: 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
f510: 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
f520: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
f530: 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
f540: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
f550: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
f560: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
f570: 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
f580: 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
f590: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
f5a0: 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
f5b0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
f5c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
f5d0: 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
f5e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
f5f0: 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
f600: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
f610: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
f620: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
f630: 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
f640: 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
f650: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
f660: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f670: 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
f680: 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
f690: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
f6a0: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
f6b0: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
f6c0: 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
f6d0: 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
f6e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
f6f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
f700: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
f710: 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
f720: 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
f730: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
f740: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f750: 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
f760: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
f770: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
f780: 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
f790: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
f7a0: 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
f7b0: 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
f7c0: 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
f7d0: 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
f7e0: 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
f7f0: 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
f800: 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
f810: 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
f820: 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
f830: 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
f840: 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
f850: 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
f860: 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
f870: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
f880: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
f890: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f8a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
f8b0: 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
f8c0: 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
f8d0: 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
f8e0: 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
f8f0: 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
f900: 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
f910: 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
f920: 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
f930: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
f940: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f950: 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
f960: 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
f970: 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73   _SHM_WRLCK, ofs
f980: 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
f990: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
f9a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f9b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
f9c0: 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
f9d0: 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
f9e0: 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
f9f0: 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
fa00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
fa10: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fa20: 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
fa30: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
fa40: 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
fa50: 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
fa60: 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20  x,%03x %s\n",.  
fa70: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
fa80: 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50  (int)GetCurrentP
fa90: 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73  rocessId(), p->s
faa0: 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
fab0: 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
fac0: 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22     rc ? "failed"
fad0: 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74   : "ok"));.  ret
fae0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
faf0: 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
fb00: 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
fb10: 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
fb20: 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
fb30: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
fb40: 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
fb50: 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
fb60: 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
fb70: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
fb80: 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
fb90: 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
fba0: 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
fbb0: 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72   void winShmBarr
fbc0: 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
fbd0: 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
fbe0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
fbf0: 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
fc00: 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
fc10: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
fc20: 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79  fd);.  /* Memory
fc30: 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f  Barrier(); // do
fc40: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64  es not work -- d
fc50: 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e  o not know why n
fc60: 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  ot */.  winShmEn
fc70: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69  terMutex();.  wi
fc80: 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
fc90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
fca0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
fcb0: 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
fcc0: 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
fcd0: 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
fce0: 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
fcf0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
fd00: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
fd10: 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
fd20: 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
fd30: 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
fd40: 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
fd50: 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
fd60: 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
fd70: 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
fd80: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
fd90: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
fda0: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
fdb0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
fdc0: 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
fdd0: 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
fde0: 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
fdf0: 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65  isWrite paramete
fe00: 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
fe10: 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
fe20: 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
fe30: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
fe40: 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
fe50: 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
fe60: 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
fe70: 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
fe80: 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
fe90: 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
fea0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
feb0: 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
fec0: 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
fed0: 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
fee0: 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
fef0: 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
ff00: 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
ff10: 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
ff20: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
ff30: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
ff40: 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
ff50: 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
ff60: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
ff70: 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
ff80: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
ff90: 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
ffa0: 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
ffb0: 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
ffc0: 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
ffd0: 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
ffe0: 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
fff0: 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
10000 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
10010 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
10020 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
10030 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
10040 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10050 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71   winShmMap(.  sq
10060 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10080 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
10090 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
100a0 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
100d0 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
100e0 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10100 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
10110 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74   */.  int isWrit
10120 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10130 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
10140 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
10150 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
10160 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
10170 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
10180 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
10190 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  mory */.){.  win
101a0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
101b0 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69  inFile*)fd;.  wi
101c0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
101d0 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
101e0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
101f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10200 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29  _OK;..  if( !p )
10210 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
10220 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
10230 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
10240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
10250 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20  eturn rc;.    p 
10260 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
10270 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20   }.  pShmNode = 
10280 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
10290 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
102a0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
102b0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
102c0 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
102d0 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
102e0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
102f0 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
10300 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
10310 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
10320 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
10330 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20  n *apNew;       
10340 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69      /* New aRegi
10350 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
10360 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
10370 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
10380 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
10390 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
103a0 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
103b0 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20  3_int64 sz;     
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103d0 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
103e0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a  wal-index file *
103f0 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
10400 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
10410 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
10420 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
10430 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
10440 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
10450 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
10460 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
10470 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
10480 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
10490 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
104a0 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
104b0 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
104c0 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
104d0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
104e0 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
104f0 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
10500 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
10510 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
10520 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
10530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10540 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
10550 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10560 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
10570 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
10580 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
10590 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
105a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
105b0 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
105c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
105d0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
105e0 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
105f0 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
10600 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
10610 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
10620 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
10630 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
10640 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
10650 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
10660 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
10670 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
10680 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
10690 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
106a0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
106b0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
106c0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
106d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
106e0 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
106f0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
10700 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
10710 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
10720 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
10730 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
10740 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10760 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
10770 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
10780 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 69 6e 53  R_SHMSIZE, "winS
10790 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
107a0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
107b0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
107c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
107d0 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
107e0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
107f0 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
10800 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
10810 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
10820 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
10830 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
10840 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
10850 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
10860 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
10870 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
10880 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
10890 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
108a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
108b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
108c0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
108d0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
108e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
108f0 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
10900 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
10910 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
10920 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
10930 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
10940 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
10950 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
10960 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
10970 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
10980 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
10990 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  mory region */. 
109a0 20 20 20 20 0a 20 20 20 20 20 20 68 4d 61 70 20      .      hMap 
109b0 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  = CreateFileMapp
109c0 69 6e 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ing(pShmNode->hF
109d0 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
109e0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
109f0 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
10a00 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
10a10 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
10a20 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63  SHM-MAP pid-%d c
10a30 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20  reate region=%d 
10a40 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a  nbyte=%d %s\n",.
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10a60 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
10a70 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
10a80 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42  ode->nRegion, nB
10a90 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
10aa0 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20      hMap ? "ok" 
10ab0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
10ac0 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a      if( hMap ){.
10ad0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
10ae0 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  set = pShmNode->
10af0 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  nRegion*szRegion
10b00 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
10b10 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66  ffsetShift = iOf
10b20 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66  fset % winSysInf
10b30 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
10b40 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 20  anularity;.     
10b50 20 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69 65     pMap = MapVie
10b60 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49  wOfFile(hMap, FI
10b70 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
10b80 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
10b90 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66            0, iOf
10ba0 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
10bb0 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
10bc0 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
10bd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
10be0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
10bf0 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67  P pid-%d map reg
10c00 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64  ion=%d offset=%d
10c10 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   size=%d %s\n",.
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74   (int)GetCurrent
10c40 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
10c50 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
10c60 69 4f 66 66 73 65 74 2c 20 73 7a 52 65 67 69 6f  iOffset, szRegio
10c70 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
10c80 20 20 20 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20      pMap ? "ok" 
10c90 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
10ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10cb0 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  !pMap ){.       
10cc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
10cd0 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
10ce0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72  ror();.        r
10cf0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
10d00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
10d10 4d 41 50 2c 20 22 77 69 6e 53 68 6d 4d 61 70 33  MAP, "winShmMap3
10d20 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
10d30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
10d40 61 70 20 29 20 43 6c 6f 73 65 48 61 6e 64 6c 65  ap ) CloseHandle
10d50 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
10d60 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
10d70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10d80 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
10d90 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
10da0 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
10db0 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
10dc0 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
10dd0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
10de0 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
10df0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
10e00 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
10e10 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
10e20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
10e30 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
10e40 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
10e50 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
10e60 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
10e70 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
10e80 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
10e90 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
10ea0 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
10eb0 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
10ec0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
10ed0 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
10ee0 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
10ef0 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
10f00 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
10f10 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
10f20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10f30 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
10f40 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10f50 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
10f60 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
10f70 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
10f80 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
10f90 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
10fa0 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
10fb0 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
10fc0 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
10fd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
10fe0 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  AL */../*.** Her
10ff0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
11000 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
11010 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
11020 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
11050 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
11060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11070 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
11080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
110d0 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
110e0 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
110f0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
11100 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
11110 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
11120 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
11130 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
11140 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
11150 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20  ethod = {.  2,  
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
11180 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
11190 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
111b0 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
111c0 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
111d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
111e0 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
111f0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
11200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
11210 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
11220 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
11230 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
11240 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
11250 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
11260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
11270 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
11280 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
11290 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
112a0 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
112b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
112c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
112d0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
112e0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
112f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
11300 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
11310 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
11320 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
11330 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
11340 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
11350 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
11360 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
11370 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
11380 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
11390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
113a0 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
113b0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
113c0 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
113d0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
113e0 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
113f0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
11400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11410 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
11420 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
11430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11440 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
11450 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11470 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
11480 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20   winShmUnmap    
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114a0 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
114b0 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
114c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11500 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
11510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11520 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
11530 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
11540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11550 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
11560 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
11570 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
11580 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
11590 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
115a0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
115b0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
115c0 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
115d0 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
115e0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
115f0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
11600 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
11610 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
11620 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
11630 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
11640 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
11650 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
11660 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
11670 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
11680 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72  tic void *conver
11690 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  tUtf8Filename(co
116a0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
116b0 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
116c0 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
116d0 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
116e0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75    zConverted = u
116f0 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
11700 6c 65 6e 61 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54  lename);./* isNT
11710 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
11720 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
11730 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
11740 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
11750 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
11760 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
11770 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
11780 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
11790 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a  2_utf8_to_mbcs(z
117a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
117b0 66 0a 20 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65  f.  }.  /* calle
117c0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
117d0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
117e0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
117f0 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ed;.}../*.** Cre
11800 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
11810 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
11820 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
11830 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a   big enough to.*
11840 2a 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e  * hold at pVfs->
11850 6d 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61  mxPathname chara
11860 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
11870 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65   int getTempname
11880 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
11890 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  *zBuf){.  static
118a0 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
118b0 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
118c0 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
118d0 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
118e0 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
118f0 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
11900 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c  89";.  size_t i,
11910 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70   j;.  char zTemp
11920 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  Path[MAX_PATH+1]
11930 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
11940 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
11950 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
11960 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
11970 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
11980 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
11990 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
119a0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
119b0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
119c0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
119d0 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
119e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
119f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11a00 52 52 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  RR );..  if( sql
11a10 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
11a20 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
11a30 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
11a40 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
11a50 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  th, "%s", sqlite
11a60 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
11a70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
11a80 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
11a90 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57  r *zMulti;.    W
11aa0 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d  CHAR zWidePath[M
11ab0 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65  AX_PATH];.    Ge
11ac0 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50  tTempPathW(MAX_P
11ad0 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74  ATH-30, zWidePat
11ae0 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d  h);.    zMulti =
11af0 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
11b00 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
11b10 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
11b20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
11b30 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
11b40 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
11b50 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
11b60 20 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20   free(zMulti);. 
11b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11b90 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73  MEM;.    }./* is
11ba0 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
11bb0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
11bc0 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
11bd0 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
11be0 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
11bf0 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
11c00 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
11c10 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
11c20 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
11c30 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
11c40 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
11c50 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
11c60 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
11c70 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
11c80 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
11c90 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
11ca0 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50   zMbcsPath[MAX_P
11cb0 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d  ATH];.    GetTem
11cc0 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d  pPathA(MAX_PATH-
11cd0 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a  30, zMbcsPath);.
11ce0 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
11cf0 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
11d00 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
11d10 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
11d20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11d30 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
11d40 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
11d50 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  h, "%s", zUtf8);
11d60 0a 20 20 20 20 20 20 66 72 65 65 28 7a 55 74 66  .      free(zUtf
11d70 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
11d80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11d90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
11da0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
11db0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
11dc0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
11dd0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
11de0 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
11df0 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
11e00 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
11e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
11e20 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
11e30 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11e40 7a 54 65 6d 70 50 61 74 68 29 20 2b 20 73 71 6c  zTempPath) + sql
11e50 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c  ite3Strlen30(SQL
11e60 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
11e70 45 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 6e  EFIX) + 17) >= n
11e80 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Buf ){.    retur
11e90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
11ea0 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c    }..  for(i=sql
11eb0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
11ec0 6d 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20  mpPath); i>0 && 
11ed0 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d  zTempPath[i-1]==
11ee0 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  '\\'; i--){}.  z
11ef0 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b  TempPath[i] = 0;
11f00 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
11f10 69 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42  intf(nBuf-17, zB
11f20 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  uf,.            
11f30 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c         "%s\\"SQL
11f40 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
11f50 45 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29  EFIX, zTempPath)
11f60 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53  ;.  j = sqlite3S
11f70 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
11f80 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
11f90 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
11fa0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
11fb0 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
11fc0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
11fd0 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
11fe0 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
11ff0 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
12000 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20  rs)-1) ];.  }.  
12010 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 0a 20 20  zBuf[j] = 0;..  
12020 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 20 46  OSTRACE(("TEMP F
12030 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20  ILENAME: %s\n", 
12040 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
12050 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
12060 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
12070 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12080 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
12090 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
120a0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
120b0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
120c0 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
120d0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
120e0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
120f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
12100 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
12110 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
12120 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
12130 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12150 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
12160 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
12170 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
12180 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
12190 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
121a0 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
121b0 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65  RD dwDesiredAcce
121c0 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68  ss;.  DWORD dwSh
121d0 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44  areMode;.  DWORD
121e0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
121f0 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  sition;.  DWORD 
12200 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
12210 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51  utes = 0;.#if SQ
12220 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12230 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a  int isTemp = 0;.
12240 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65  #endif.  winFile
12250 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
12260 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
12270 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20  zConverted;     
12280 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
12290 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64  name in OS encod
122a0 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
122b0 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d  har *zUtf8Name =
122c0 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e   zName; /* Filen
122d0 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63  ame in UTF-8 enc
122e0 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63  oding */.  int c
122f0 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  nt = 0;..  /* If
12300 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
12310 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
12320 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
12330 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
12340 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
12350 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
12360 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
12370 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
12380 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
12390 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
123a0 50 41 54 48 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  PATH+1];     /* 
123b0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63  Buffer used to c
123c0 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e  reate temp filen
123d0 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63  ame */..  int rc
123e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
123f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
12400 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
12410 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
12420 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49  (NDEBUG) || SQLI
12430 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
12440 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
12450 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
12460 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
12470 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  open */.#endif..
12480 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
12490 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
124a0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
124b0 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
124c0 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
124d0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
124e0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
124f0 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
12500 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
12510 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
12520 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
12530 47 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  G.  int isReadon
12540 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
12550 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
12560 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ONLY);.#endif.  
12570 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
12580 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
12590 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
125a0 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  E);..#ifndef NDE
125b0 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e  BUG.  int isOpen
125c0 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65  Journal = (isCre
125d0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
125e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
125f0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
12600 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
12610 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
12620 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
12630 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
12640 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
12650 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  ;.#endif..  /* C
12660 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
12670 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
12680 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
12690 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
126a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
126b0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
126c0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
126d0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
126e0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
126f0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
12700 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
12710 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
12720 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
12730 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
12740 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
12750 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
12760 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
12770 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
12780 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
12790 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
127a0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
127b0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
127c0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
127d0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
127e0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
127f0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
12800 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
12810 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
12820 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
12830 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
12840 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
12850 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
12860 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
12870 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
12880 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
12890 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
128a0 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
128b0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
128c0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
128d0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
128e0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
128f0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
12900 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
12910 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
12920 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
12930 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
12940 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
12950 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
12960 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
12970 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
12980 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
12990 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
129a0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
129b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
129c0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
129d0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
129e0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
129f0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
12a00 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
12a10 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
12a20 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
12a30 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
12a40 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
12a50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
12a60 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
12a70 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
12a80 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
12a90 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
12aa0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
12ab0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
12ac0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
12ad0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
12ae0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
12af0 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
12b00 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
12b10 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
12b20 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
12b30 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
12b40 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
12b50 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
12b60 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73  N_WAL.  );..  as
12b70 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
12b80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12b90 52 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c  R(pVfs);..  pFil
12ba0 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
12bb0 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20  ANDLE_VALUE;..  
12bc0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
12bd0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
12be0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
12bf0 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
12c00 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
12c10 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
12c20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
12c30 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
12c40 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
12c50 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29   !isOpenJournal)
12c60 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65  ;.    rc = getTe
12c70 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b  mpname(MAX_PATH+
12c80 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  1, zTmpname);.  
12c90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12ca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
12cb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12cc0 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
12cd0 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
12ce0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69  * Convert the fi
12cf0 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79  lename to the sy
12d00 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a  stem encoding. *
12d10 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  /.  zConverted =
12d20 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
12d30 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b  name(zUtf8Name);
12d40 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
12d50 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
12d60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12d70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
12d80 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64  adWrite ){.    d
12d90 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
12da0 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
12db0 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20  GENERIC_WRITE;. 
12dc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65   }else{.    dwDe
12dd0 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
12de0 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a  NERIC_READ;.  }.
12df0 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  /* SQLITE_OPE
12e00 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75  N_EXCLUSIVE is u
12e10 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
12e20 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65   that a new file
12e30 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65   is .  ** create
12e40 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
12e50 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
12e60 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
12e70 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73  access" .  ** as
12e80 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
12e90 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
12ea0 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
12eb0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  e ){.    /* Crea
12ec0 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
12ed0 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
12ee0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
12ef0 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
12f00 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
12f10 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
12f20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
12f30 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
12f40 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
12f50 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
12f60 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
12f70 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
12f80 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
12f90 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
12fa0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
12fb0 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
12fc0 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
12fd0 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
12fe0 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
12ff0 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
13000 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
13010 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
13020 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65  ;.  }..  dwShare
13030 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
13040 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
13050 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66  ARE_WRITE;..  if
13060 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
13070 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13080 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
13090 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
130a0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
130b0 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
130c0 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
130d0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
130e0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
130f0 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
13120 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
13130 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
13160 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
13170 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
13180 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
13190 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
131a0 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
131b0 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
131c0 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
131d0 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
131e0 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
131f0 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
13200 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
13210 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
13220 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
13230 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
13240 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
13250 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
13260 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
13270 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
13280 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54  ndif..  if( isNT
13290 28 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  () ){.    while(
132a0 20 28 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65   (h = CreateFile
132b0 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
132c0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
132f0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
13300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
13310 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c  wShareMode, NULL
13320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
13340 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
13350 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
13360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13370 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
13380 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
133b0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
133c0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
133e0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 29 20  etryIoerr(&cnt) 
133f0 29 7b 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73  ){}./* isNT() is
13400 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
13410 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
13420 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
13430 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
13440 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
13450 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
13460 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
13470 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
13480 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
13490 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
134a0 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
134b0 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
134c0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
134d0 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
134e0 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
134f0 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61  CreateFileA((cha
13500 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  r*)zConverted,. 
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13520 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
13530 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
13560 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
13590 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
135c0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
135f0 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
13600 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
13630 72 72 28 26 63 6e 74 29 20 29 7b 7d 0a 23 65 6e  rr(&cnt) ){}.#en
13640 64 69 66 0a 20 20 7d 0a 0a 20 20 6c 6f 67 49 6f  dif.  }..  logIo
13650 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54  err(cnt);..  OST
13660 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
13670 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a  s 0x%lx %s\n", .
13680 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e             h, zN
13690 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
136a0 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20  cess, .         
136b0 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e    h==INVALID_HAN
136c0 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69  DLE_VALUE ? "fai
136d0 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
136e0 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44    if( h==INVALID
136f0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
13700 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
13710 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
13720 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
13730 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
13740 41 4e 54 4f 50 45 4e 2c 20 22 77 69 6e 4f 70 65  ANTOPEN, "winOpe
13750 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
13760 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
13770 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ted);.    if( is
13780 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
13790 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65     return winOpe
137a0 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69  n(pVfs, zName, i
137b0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
137c0 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
137d0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e  OPEN_READONLY)&~
137e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
137f0 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
13800 52 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75  READWRITE)), pOu
13810 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
13820 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
13830 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
13840 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
13850 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
13860 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
13870 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
13880 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
13890 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
138a0 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
138b0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
138c0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
138d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
138e0 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46    }..  memset(pF
138f0 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ile, 0, sizeof(*
13900 70 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  pFile));.  pFile
13910 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e  ->pMethod = &win
13920 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c  IoMethod;.  pFil
13930 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c  e->h = h;.  pFil
13940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
13950 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
13960 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
13970 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30   pFile->pShm = 0
13980 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ;.  pFile->zPath
13990 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c   = zName;.  pFil
139a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
139b0 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 56  getSectorSize(pV
139c0 66 73 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  fs, zUtf8Name);.
139d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
139e0 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61  INCE.  if( isRea
139f0 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d  dWrite && eType=
13a00 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
13a10 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 21  N_DB.       && !
13a20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
13a30 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20  zName, pFile).  
13a40 29 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  ){.    CloseHand
13a50 6c 65 28 68 29 3b 0a 20 20 20 20 66 72 65 65 28  le(h);.    free(
13a60 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
13a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13a80 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
13a90 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
13aa0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65  {.    pFile->zDe
13ab0 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43  leteOnClose = zC
13ac0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73  onverted;.  }els
13ad0 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
13ae0 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
13af0 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f  );.  }..  OpenCo
13b00 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
13b10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13b20 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65   Delete the name
13b30 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  d file..**.** No
13b40 74 65 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20  te that windows 
13b50 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
13b60 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
13b70 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
13b80 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73  r.** process has
13b90 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74   it open.  Somet
13ba0 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61  imes a virus sca
13bb0 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67  nner or indexing
13bc0 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c   program.** will
13bd0 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
13be0 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74  file shortly aft
13bf0 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64  er it is created
13c00 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a   in order to do.
13c10 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64  ** whatever it d
13c20 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73  oes.  While this
13c30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
13c40 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a  s holding the.**
13c50 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77   file open, we w
13c60 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  ill be unable to
13c70 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20   delete it.  To 
13c80 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
13c90 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  .** problem, we 
13ca0 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73  delay 100 millis
13cb0 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74  econds and try t
13cc0 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20  o delete again. 
13cd0 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c   Up.** to MX_DEL
13ce0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64  ETION_ATTEMPTs d
13cf0 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  eletion attempts
13d00 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20   are run before 
13d10 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64  giving.** up and
13d20 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
13d30 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
13d40 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20  nt winDelete(.  
13d50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13d60 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s,          /* N
13d70 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
13d80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
13d90 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
13da0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
13db0 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  e to delete */. 
13dc0 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20   int syncDir    
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13de0 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
13df0 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e  2 */.){.  int cn
13e00 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
13e10 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
13e20 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
13e30 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
13e40 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13e50 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53  R(syncDir);..  S
13e60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
13e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13e80 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43  RR_DELETE);.  zC
13e90 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
13ea0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
13eb0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
13ec0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
13ed0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13ee0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
13ef0 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
13f00 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77     rc = 1;.    w
13f10 68 69 6c 65 28 20 47 65 74 46 69 6c 65 41 74 74  hile( GetFileAtt
13f20 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72  ributesW(zConver
13f30 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49  ted)!=INVALID_FI
13f40 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
13f50 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20  .           (rc 
13f60 3d 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43  = DeleteFileW(zC
13f70 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26  onverted))==0 &&
13f80 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
13f90 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72  ) ){}.    rc = r
13fa0 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  c ? SQLITE_OK : 
13fb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 2f 2a  SQLITE_ERROR;./*
13fc0 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
13fd0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
13fe0 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
13ff0 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
14000 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
14010 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20  e ASCII version 
14020 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
14030 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
14040 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
14050 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
14060 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
14070 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
14080 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
14090 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
140a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
140b0 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 1;.    while(
140c0 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
140d0 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 21  esA(zConverted)!
140e0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
140f0 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
14100 20 20 20 20 20 20 20 28 72 63 20 3d 20 44 65 6c         (rc = Del
14110 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
14120 74 65 64 29 29 3d 3d 30 20 26 26 20 72 65 74 72  ted))==0 && retr
14130 79 49 6f 65 72 72 28 26 63 6e 74 29 20 29 7b 7d  yIoerr(&cnt) ){}
14140 0a 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53  .    rc = rc ? S
14150 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
14160 45 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a  E_ERROR;.#endif.
14170 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
14180 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
14190 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
141a0 52 5f 44 45 4c 45 54 45 2c 20 22 77 69 6e 44 65  R_DELETE, "winDe
141b0 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  lete", zFilename
141c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
141d0 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  logIoerr(cnt);. 
141e0 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65   }.  free(zConve
141f0 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
14200 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  (("DELETE \"%s\"
14210 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
14220 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64  e, (rc ? "failed
14230 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20  " : "ok" )));.  
14240 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14250 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
14260 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74  istance and stat
14270 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
14280 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
14290 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
142a0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
142b0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
142c0 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
142d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
142e0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
142f0 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
14300 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
14310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14320 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
14330 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
14340 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
14350 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
14360 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
14370 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
14380 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
14390 72 63 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  rc = 0;.  void *
143a0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
143b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
143c0 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
143d0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
143e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
143f0 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76  CESS; );.  zConv
14400 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
14410 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
14420 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  ename);.  if( zC
14430 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
14440 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14450 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
14460 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
14470 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
14480 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
14490 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
144a0 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
144b0 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
144c0 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
144d0 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
144e0 28 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74  (rc = GetFileAtt
144f0 72 69 62 75 74 65 73 45 78 57 28 28 57 43 48 41  ributesExW((WCHA
14500 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
14530 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
14540 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
14570 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
14580 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
14590 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
145a0 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
145b0 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
145c0 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
145d0 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
145e0 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
145f0 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
14600 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
14610 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
14620 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
14630 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
14640 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
14650 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  h==0 .          
14660 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
14670 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a  leSizeLow==0 ){.
14680 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
14690 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
146a0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65  IBUTES;.      }e
146b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
146c0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
146d0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
146e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
146f0 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72  e{.      logIoer
14700 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  r(cnt);.      if
14710 28 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  ( GetLastError()
14720 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  !=ERROR_FILE_NOT
14730 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
14740 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
14750 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
14760 53 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20  S, "winAccess", 
14770 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
14780 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
14790 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
147a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
147b0 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20  R_ACCESS;.      
147c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
147d0 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
147e0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
147f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20       }.    }./* 
14800 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
14810 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
14820 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
14830 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
14840 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
14850 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
14860 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
14870 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
14880 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
14890 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
148a0 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
148b0 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
148c0 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
148d0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
148e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74    }else{.    att
148f0 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  r = GetFileAttri
14900 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43  butesA((char*)zC
14910 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
14920 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f  f.  }.  free(zCo
14930 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
14940 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
14950 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
14960 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
14970 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
14980 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
14990 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
149a0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
149b0 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
149c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
149d0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
149e0 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
149f0 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
14a00 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
14a10 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
14a20 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
14a30 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
14a40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14a50 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
14a60 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
14a70 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
14a80 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
14a90 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
14aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
14ab0 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
14ac0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
14ad0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
14ae0 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ame.  Write the 
14af0 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65  full.** pathname
14b00 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a   into zOut[].  z
14b10 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74  Out[] will be at
14b20 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50   least pVfs->mxP
14b30 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73  athname.** bytes
14b40 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
14b50 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50  tic int winFullP
14b60 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
14b70 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
14b80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
14b90 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
14ba0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
14bb0 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20  r *zRelative,   
14bc0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
14bd0 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
14be0 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
14bf0 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
14c00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
14c10 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
14c20 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
14c30 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20  har *zFull      
14c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c50 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
14c60 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  .){.  .#if defin
14c70 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
14c80 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14c90 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
14ca0 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45  ERROR );.  UNUSE
14cb0 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
14cc0 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e  l);.  cygwin_con
14cd0 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f  v_to_full_win32_
14ce0 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20  path(zRelative, 
14cf0 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zFull);.  return
14d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
14d10 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
14d20 53 5f 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61  S_WINCE.  Simula
14d30 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
14d40 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
14d50 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
14d60 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f  ETER(nFull);.  /
14d70 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
14d80 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
14d90 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
14da0 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
14db0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  */.  sqlite3_snp
14dc0 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
14dd0 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
14de0 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
14df0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14e00 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
14e10 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
14e20 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
14e30 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
14e40 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
14e50 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
14e60 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  r *zOut;..  /* I
14e70 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65  f this path name
14e80 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58   begins with "/X
14e90 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73  :", where "X" is
14ea0 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a   any alphabetic.
14eb0 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
14ec0 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74  discard the init
14ed0 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65  ial "/" from the
14ee0 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   pathname..  */.
14ef0 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
14f00 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74  0]=='/' && sqlit
14f10 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74  e3Isalpha(zRelat
14f20 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61  ive[1]) && zRela
14f30 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a  tive[2]==':' ){.
14f40 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
14f50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
14f60 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
14f70 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
14f80 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
14f90 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
14fa0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
14fb0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
14fc0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
14fd0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
14fe0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
14ff0 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
15000 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
15010 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
15020 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
15030 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
15040 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
15050 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
15060 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
15070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15080 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
15090 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
150a0 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
150b0 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
150c0 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
150d0 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
150e0 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65  {.    WCHAR *zTe
150f0 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
15100 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
15110 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
15120 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20  ted, 0, 0, 0) + 
15130 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d  3;.    zTemp = m
15140 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
15150 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
15160 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
15170 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
15180 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
15190 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
151a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
151b0 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d    GetFullPathNam
151c0 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
151d0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
151e0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  emp, 0);.    fre
151f0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
15200 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64     zOut = unicod
15210 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
15220 20 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b      free(zTemp);
15230 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
15240 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15250 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
15260 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
15270 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
15280 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
15290 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
152a0 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
152b0 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
152c0 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
152d0 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
152e0 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
152f0 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
15300 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
15310 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
15320 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
15330 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
15340 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
15350 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
15360 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20   0, 0) + 3;.    
15370 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20  zTemp = malloc( 
15380 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
15390 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
153a0 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
153b0 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
153c0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
153d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
153e0 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75  .    }.    GetFu
153f0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
15400 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
15410 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
15420 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65  .    free(zConve
15430 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
15440 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
15450 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
15460 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54  mp);.    free(zT
15470 65 6d 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  emp);.#endif.  }
15480 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
15490 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
154a0 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ntf(pVfs->mxPath
154b0 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  name, zFull, "%s
154c0 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 66 72  ", zOut);.    fr
154d0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
154e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
154f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
15500 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15510 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
15520 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 73 65  /*.** Get the se
15530 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65  ctor size of the
15540 20 64 65 76 69 63 65 20 75 73 65 64 20 74 6f 20   device used to 
15550 73 74 6f 72 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  store.** file..*
15560 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
15570 53 65 63 74 6f 72 53 69 7a 65 28 0a 20 20 20 20  SectorSize(.    
15580 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
15590 73 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  s,.    const cha
155a0 72 20 2a 7a 52 65 6c 61 74 69 76 65 20 20 20 20  r *zRelative    
155b0 20 2f 2a 20 55 54 46 2d 38 20 66 69 6c 65 20 6e   /* UTF-8 file n
155c0 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52  ame */.){.  DWOR
155d0 44 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72  D bytesPerSector
155e0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
155f0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
15600 20 2f 2a 20 47 65 74 44 69 73 6b 46 72 65 65 53   /* GetDiskFreeS
15610 70 61 63 65 20 69 73 20 6e 6f 74 20 73 75 70 70  pace is not supp
15620 6f 72 74 65 64 20 75 6e 64 65 72 20 57 49 4e 43  orted under WINC
15630 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
15640 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55 53 45  OS_WINCE.  UNUSE
15650 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
15660 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
15670 4d 45 54 45 52 28 7a 52 65 6c 61 74 69 76 65 29  METER(zRelative)
15680 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20 7a  ;.#else.  char z
15690 46 75 6c 6c 70 61 74 68 5b 4d 41 58 5f 50 41 54  Fullpath[MAX_PAT
156a0 48 2b 31 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  H+1];.  int rc;.
156b0 20 20 44 57 4f 52 44 20 64 77 52 65 74 20 3d 20    DWORD dwRet = 
156c0 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 75 6d  0;.  DWORD dwDum
156d0 6d 79 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57  my;..  /*.  ** W
156e0 65 20 6e 65 65 64 20 74 6f 20 67 65 74 20 74 68  e need to get th
156f0 65 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  e full path name
15700 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   of the file.  *
15710 2a 20 74 6f 20 67 65 74 20 74 68 65 20 64 72 69  * to get the dri
15720 76 65 20 6c 65 74 74 65 72 20 74 6f 20 6c 6f 6f  ve letter to loo
15730 6b 20 75 70 20 74 68 65 20 73 65 63 74 6f 72 0a  k up the sector.
15740 20 20 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a    ** size..  */.
15750 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
15760 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 72 63  rBenign(1);.  rc
15770 20 3d 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61   = winFullPathna
15780 6d 65 28 70 56 66 73 2c 20 7a 52 65 6c 61 74 69  me(pVfs, zRelati
15790 76 65 2c 20 4d 41 58 5f 50 41 54 48 2c 20 7a 46  ve, MAX_PATH, zF
157a0 75 6c 6c 70 61 74 68 29 3b 0a 20 20 53 69 6d 75  ullpath);.  Simu
157b0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
157c0 6e 28 30 29 3b 0a 20 20 69 66 28 20 72 63 20 3d  n(0);.  if( rc =
157d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20  = SQLITE_OK ).  
157e0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  {.    void *zCon
157f0 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
15800 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75  Utf8Filename(zFu
15810 6c 6c 70 61 74 68 29 3b 0a 20 20 20 20 69 66 28  llpath);.    if(
15820 20 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20   zConverted ){. 
15830 20 20 20 20 20 69 66 28 20 69 73 4e 54 28 29 20       if( isNT() 
15840 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72  ){.        /* tr
15850 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20  im path to just 
15860 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  drive reference 
15870 2a 2f 0a 20 20 20 20 20 20 20 20 57 43 48 41 52  */.        WCHAR
15880 20 2a 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64   *p = zConverted
15890 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a  ;.        for(;*
158a0 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  p;p++){.        
158b0 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27    if( *p == '\\'
158c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
158d0 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  *p = '\0';.     
158e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
158f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15900 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65    }.        dwRe
15910 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53  t = GetDiskFreeS
15920 70 61 63 65 57 28 28 57 43 48 41 52 2a 29 7a 43  paceW((WCHAR*)zC
15930 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
15960 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ummy,.          
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15980 20 20 20 20 20 20 20 20 26 62 79 74 65 73 50 65          &bytesPe
15990 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20  rSector,.       
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
159c0 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mmy,.           
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29         &dwDummy)
159f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15a00 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70         /* trim p
15a10 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76  ath to just driv
15a20 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20  e reference */. 
15a30 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d         char *p =
15a40 20 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72   (char *)zConver
15a50 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ted;.        for
15a60 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20  (;*p;p++){.     
15a70 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27       if( *p == '
15a80 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
15a90 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20     *p = '\0';.  
15aa0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15ab0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
15ad0 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b 46 72  wRet = GetDiskFr
15ae0 65 65 53 70 61 63 65 41 28 28 63 68 61 72 2a 29  eeSpaceA((char*)
15af0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
15b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
15b20 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20  wDummy,.        
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 20 20 20 20 20 20 20 20 20 20 26 62 79 74 65 73            &bytes
15b50 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20  PerSector,.     
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77               &dw
15b80 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20  Dummy,.         
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
15bb0 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
15bc0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
15bd0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
15be0 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20 20 20  ( !dwRet ){.    
15bf0 20 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72    bytesPerSector
15c00 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
15c10 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
15c20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
15c30 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 62    return (int) b
15c40 79 74 65 73 50 65 72 53 65 63 74 6f 72 3b 20 0a  ytesPerSector; .
15c50 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15c60 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
15c70 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
15c80 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
15c90 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
15ca0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
15cb0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
15cc0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
15cd0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
15ce0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
15cf0 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  ibrary..*/./*.**
15d00 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
15d10 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
15d20 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
15d30 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
15d40 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
15d50 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
15d60 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
15d70 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
15d80 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
15d90 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
15da0 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
15db0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
15dc0 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
15dd0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
15de0 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
15df0 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
15e00 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
15e10 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
15e20 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
15e30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
15e40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
15e50 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f  () ){.    h = Lo
15e60 61 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41  adLibraryW((WCHA
15e70 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  R*)zConverted);.
15e80 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
15e90 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
15ea0 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
15eb0 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
15ec0 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
15ed0 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
15ee0 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
15ef0 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
15f00 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
15f10 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
15f20 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
15f30 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
15f40 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
15f50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
15f60 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
15f70 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 41  h = LoadLibraryA
15f80 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
15f90 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
15fa0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
15fb0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
15fc0 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
15fd0 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
15fe0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
15ff0 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
16000 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
16010 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16020 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74  pVfs);.  getLast
16030 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a  ErrorMsg(nBuf, z
16040 42 75 66 4f 75 74 29 3b 0a 7d 0a 76 6f 69 64 20  BufOut);.}.void 
16050 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
16060 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
16070 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
16080 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
16090 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53  ))(void){.  UNUS
160a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
160b0 73 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s);.#if SQLITE_O
160c0 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65  S_WINCE.  /* The
160d0 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41   GetProcAddressA
160e0 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  () routine is on
160f0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
16100 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75  wince. */.  retu
16110 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
16120 29 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ))GetProcAddress
16130 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  A((HANDLE)pHandl
16140 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c  e, zSymbol);.#el
16150 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65  se.  /* All othe
16160 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f  r windows platfo
16170 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72  rms expect GetPr
16180 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74  ocAddress() to t
16190 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69  ake.  ** an Ansi
161a0 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65   string regardle
161b0 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f  ss of the _UNICO
161c0 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  DE setting */.  
161d0 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
161e0 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64 64  void))GetProcAdd
161f0 72 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48 61  ress((HANDLE)pHa
16200 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
16210 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69  #endif.}.void wi
16220 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
16230 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
16240 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
16250 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
16260 56 66 73 29 3b 0a 20 20 46 72 65 65 4c 69 62 72  Vfs);.  FreeLibr
16270 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
16280 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
16290 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
162a0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
162b0 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
162c0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
162d0 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
162e0 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
162f0 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
16300 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
16310 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
16320 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
16330 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
16340 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
16350 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
16360 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
16370 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
16380 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
16390 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
163a0 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
163b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
163c0 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
163d0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
163e0 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
163f0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
16400 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
16410 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
16420 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
16430 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
16440 20 20 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d      GetSystemTim
16450 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&x);.    memcp
16460 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20  y(&zBuf[n], &x, 
16470 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
16480 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a  n += sizeof(x);.
16490 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
164a0 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
164b0 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64  ){.    DWORD pid
164c0 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
164d0 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65  cessId();.    me
164e0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
164f0 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
16500 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
16510 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69  of(pid);.  }.  i
16520 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
16530 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
16540 44 57 4f 52 44 20 63 6e 74 20 3d 20 47 65 74 54  DWORD cnt = GetT
16550 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
16560 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
16570 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
16580 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
16590 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 20  zeof(cnt);.  }. 
165a0 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
165b0 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
165c0 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
165d0 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 51  INTEGER i;.    Q
165e0 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
165f0 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20  ounter(&i);.    
16600 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
16610 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b   &i, sizeof(i));
16620 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
16630 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (i);.  }.#endif.
16640 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
16650 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
16660 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
16670 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
16680 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
16690 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
166a0 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
166b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
166c0 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65  microsec){.  Sle
166d0 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
166e0 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
166f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
16700 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
16710 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
16720 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
16730 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
16740 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
16750 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
16760 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
16770 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
16780 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
16790 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
167a0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
167b0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
167c0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
167d0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
167e0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
167f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
16800 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
16810 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
16820 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
16830 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
16840 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
16850 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
16860 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
16870 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
16880 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
16890 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
168a0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
168b0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
168c0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
168d0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
168e0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
168f0 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
16900 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
16910 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
16920 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
16930 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
16940 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
16950 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
16960 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
16970 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
16980 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
16990 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
169a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
169b0 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
169c0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
169d0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
169e0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
169f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
16a00 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
16a10 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
16a20 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
16a30 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46   *piNow){.  /* F
16a40 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
16a50 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
16a60 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
16a70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
16a80 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
16a90 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
16aa0 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
16ab0 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
16ac0 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49  3.5). .  */.  FI
16ad0 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61  LETIME ft;.  sta
16ae0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
16af0 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74  3_int64 winFilet
16b00 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38  imeEpoch = 23058
16b10 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  135*(sqlite3_int
16b20 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64  64)8640000;.#ifd
16b30 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16b40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
16b50 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
16b60 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
16b70 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
16b80 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  8640000;.#endif.
16b90 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61    /* 2^32 - to a
16ba0 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61  void use of LL a
16bb0 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67  nd warnings in g
16bc0 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  cc */.  static c
16bd0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
16be0 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65  64 max32BitValue
16bf0 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74   = .      (sqlit
16c00 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
16c10 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
16c20 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
16c30 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
16c40 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
16c50 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
16c60 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
16c70 6d 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54  me;.  GetSystemT
16c80 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
16c90 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
16ca0 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
16cb0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
16cc0 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 53 79 73  o. */.  if (!Sys
16cd0 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
16ce0 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
16cf0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
16d00 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74  .#else.  GetSyst
16d10 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
16d20 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
16d30 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
16d40 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
16d50 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
16d60 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
16d70 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
16d80 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
16d90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16da0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
16db0 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
16dc0 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
16dd0 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
16de0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
16df0 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
16e00 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
16e10 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
16e20 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
16e30 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
16e40 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
16e50 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
16e60 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
16e70 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
16e80 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
16e90 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
16ea0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
16eb0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
16ec0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
16ed0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
16ee0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
16ef0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
16f00 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
16f10 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
16f20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
16f30 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
16f40 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e  ound..*/.int win
16f50 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
16f60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
16f70 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
16f80 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
16f90 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63  e3_int64 i;.  rc
16fa0 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d   = winCurrentTim
16fb0 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29  eInt64(pVfs, &i)
16fc0 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20  ;.  if( !rc ){. 
16fd0 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36     *prNow = i/86
16fe0 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20  400000.0;.  }.  
16ff0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17000 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20  .** The idea is 
17010 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
17020 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20  on works like a 
17030 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a  combination of.*
17040 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
17050 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61   and FormatMessa
17060 67 65 28 29 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ge() on windows 
17070 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a  (or errno and.**
17080 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e   strerror_r() on
17090 20 75 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e   unix). After an
170a0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
170b0 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66  ed by an OS.** f
170c0 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20  unction, SQLite 
170d0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
170e0 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f  ion with zBuf po
170f0 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62  inting to.** a b
17100 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79  uffer of nBuf by
17110 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65  tes. The OS laye
17120 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74  r should populat
17130 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20  e the.** buffer 
17140 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69  with a nul-termi
17150 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f  nated UTF-8 enco
17160 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ded error messag
17170 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  e.** describing 
17180 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f  the last IO erro
17190 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72  r to have occurr
171a0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
171b0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e  lling.** thread.
171c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72  .**.** If the er
171d0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74  ror message is t
171e0 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65  oo large for the
171f0 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
17200 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62  ,.** it should b
17210 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  e truncated. The
17220 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
17230 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a   xGetLastError.*
17240 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
17250 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
17260 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
17270 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
17280 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
17290 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
172a0 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e  truncated). If n
172b0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
172c0 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ned,.** then it 
172d0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
172e0 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
172f0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63  nul-terminator c
17300 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
17310 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
17320 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70  ..**.** Not supp
17330 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  lying an error m
17340 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65  essage will have
17350 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65   no adverse effe
17360 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e  ct.** on SQLite.
17370 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68   It is fine to h
17380 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  ave an implement
17390 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72  ation that never
173a0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
173b0 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a  rror message:.**
173c0 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61  .**   int xGetLa
173d0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
173e0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
173f0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
17400 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  {.**     assert(
17410 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a  zBuf[0]=='\0');.
17420 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  **     return 0;
17430 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f  .**   }.**.** Ho
17440 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f  wever if an erro
17450 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70  r message is sup
17460 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  plied, it will b
17470 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a  e incorporated.*
17480 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f  * by sqlite into
17490 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
174a0 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ge available to 
174b0 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a  the user using.*
174c0 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  * sqlite3_errmsg
174d0 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b  (), possibly mak
174e0 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61  ing IO errors ea
174f0 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a  sier to debug..*
17500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17510 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
17520 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
17530 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
17540 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
17550 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
17560 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73  .  return getLas
17570 74 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20  tErrorMsg(nBuf, 
17580 7a 42 75 66 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  zBuf);.}..../*.*
17590 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
175a0 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
175b0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
175c0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
175d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
175e0 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
175f0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
17600 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
17610 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
17620 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
17630 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
17640 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
17650 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
17660 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20  MAX_PATH,       
17670 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
17680 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176a0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
176b0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
176c0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
176d0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
176e0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
176f0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
17700 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
17710 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
17720 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
17730 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
17740 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
17750 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
17760 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
17770 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
17780 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
17790 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
177a0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
177b0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
177c0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
177d0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
177e0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
177f0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
17800 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
17810 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
17820 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
17830 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
17840 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
17850 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
17860 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
17870 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
17880 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
17890 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
178a0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
178b0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
178c0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
178d0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
178e0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
178f0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
17900 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
17910 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
17920 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 74           /* xSet
17930 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
17940 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
17950 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79         /* xGetSy
17960 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
17970 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
17980 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73       /* xNextSys
17990 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
179a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
179b0 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65  OMIT_WAL.  /* ge
179c0 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
179d0 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
179e0 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
179f0 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
17a00 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
17a10 46 4f 29 29 3b 0a 20 20 47 65 74 53 79 73 74 65  FO));.  GetSyste
17a20 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
17a30 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 77 69 6e  o);.  assert(win
17a40 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
17a50 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20  tionGranularity 
17a60 3e 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  > 0);.#endif..  
17a70 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
17a80 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
17a90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17aa0 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c  E_OK; .}.int sql
17ab0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
17ac0 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
17ad0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
17ae0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
17af0 49 4e 20 2a 2f 0a                                IN */.