/ Hex Artifact Content
Login

Artifact 49d418916428a59d773f39993db0ecde56ab4c37:


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 20 2a 20 54  .#endif../*. * T
1380: 68 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 74  he extra flags t
1390: 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74  o use in calls t
13a0: 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65 61 70  o the Win32 heap
13b0: 20 41 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c   APIs.  This val
13c0: 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72  ue may be. * zer
13d0: 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c  o for the defaul
13e0: 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a  t behavior.. */.
13f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
1400: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a  IN32_HEAP_FLAGS.
1410: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1420: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
1430: 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66  S     (0).#endif
1440: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d  ../*.** The winM
1450: 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65  emData structure
1460: 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74   stores informat
1470: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1480: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
1490: 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65  ic.** sqlite3_me
14a0: 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d  m_methods implem
14b0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  entation..*/.typ
14c0: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d  edef struct winM
14d0: 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74  emData winMemDat
14e0: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  a;.struct winMem
14f0: 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e  Data {.#ifndef N
1500: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
1510: 63 3b 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c;    /* Magic n
1520: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
1530: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
1540: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
1550: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20    HANDLE hHeap; 
1560: 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  /* The handle to
1570: 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20   our heap. */.  
1580: 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a  BOOL bOwned;  /*
1590: 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68   Do we own the h
15a0: 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f  eap (i.e. destro
15b0: 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e  y it on shutdown
15c0: 29 3f 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65  )? */.};..#ifnde
15d0: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
15e0: 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20   WINMEM_MAGIC   
15f0: 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 65 6e    0x42b2830b.#en
1600: 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75  dif..static stru
1610: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
1620: 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23  n_mem_data = {.#
1630: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1640: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65  WINMEM_MAGIC,.#e
1650: 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c  ndif.  NULL, FAL
1660: 53 45 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  SE.};..#ifndef N
1670: 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69  DEBUG.#define wi
1680: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
1690: 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65  ) assert( win_me
16a0: 6d 5f 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49  m_data.magic==WI
16b0: 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c  NMEM_MAGIC ).#el
16c0: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
16d0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
16e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
16f0: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20 77  inMemGetHeap() w
1700: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61  in_mem_data.hHea
1710: 70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  p..static void *
1720: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
1730: 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63   nBytes);.static
1740: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65   void winMemFree
1750: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a  (void *pPrior);.
1760: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
1770: 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  MemRealloc(void 
1780: 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79  *pPrior, int nBy
1790: 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  tes);.static int
17a0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
17b0: 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74   *p);.static int
17c0: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
17d0: 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt n);.static in
17e0: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
17f0: 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74  d *pAppData);.st
1800: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
1810: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70  Shutdown(void *p
1820: 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74  AppData);..const
1830: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
1840: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d  hods *sqlite3Mem
1850: 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a  GetWin32(void);.
1860: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1870: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
1880: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
1890: 70 72 6f 74 6f 74 79 70 65 73 2e 0a 2a 2f 0a 73  prototypes..*/.s
18a0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63  tatic int getSec
18b0: 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c  torSize(.    sql
18c0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
18d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18e0: 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a  zRelative     /*
18f0: 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65   UTF-8 file name
1900: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.);../*.** Th
1910: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1920: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
1930: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
1940: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
1950: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
1960: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
1970: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
1980: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35 0a 2a  ystem is Win95.*
1990: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
19a0: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
19b0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
19c0: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
19d0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
19e0: 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  95..** 2:   Oper
19f0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
1a00: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
1a10: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
1a20: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
1a30: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
1a40: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
1a50: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
1a60: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
1a70: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
1a80: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
1a90: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1aa0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1ab0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1ac0: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73  lse.static int s
1ad0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1ae0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1af0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
1b00: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
1b10: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
1b20: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
1b30: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
1b40: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
1b50: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
1b60: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
1b70: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
1b80: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
1b90: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
1ba0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
1bb0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
1bc0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
1bd0: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
1be0: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
1bf0: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
1c00: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
1c10: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
1c20: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
1c30: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
1c40: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
1c50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1c60: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1c70: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
1c80: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
1c90: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
1ca0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
1cb0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
1cc0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
1cd0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
1ce0: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
1cf0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1d00: 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20 69 73  INCE.# define is
1d10: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a  NT()  (1).#else.
1d20: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
1d30: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
1d40: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1d50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
1d60: 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f  ERSIONINFO sInfo
1d70: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
1d80: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
1d90: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
1da0: 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72 73  );.      GetVers
1db0: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
1dc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
1dd0: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
1de0: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
1df0: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
1e00: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
1e10: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1e20: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
1e30: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1e40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
1e50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1e60: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
1e70: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
1e80: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
1e90: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
1ea0: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
1eb0: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
1ec0: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
1ed0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
1ee0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
1ef0: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
1f00: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
1f10: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
1f20: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
1f30: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1f40: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1f50: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
1f60: 41 4c 49 44 41 54 45 0a 20 20 61 73 73 65 72 74  ALIDATE.  assert
1f70: 20 28 20 48 65 61 70 56 61 6c 69 64 61 74 65 28   ( HeapValidate(
1f80: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
1f90: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
1fa0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
1fb0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
1fc0: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 48 65 61  >=0 );.  p = Hea
1fd0: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
1fe0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
1ff0: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
2000: 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70  Bytes);.  if( !p
2010: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2020: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
2030: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
2040: 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20  pAlloc %u bytes 
2050: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
2060: 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20          nBytes, 
2070: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
2080: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
2090: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
20a0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d  ../*.** Free mem
20b0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
20c0: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
20d0: 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20  oid *pPrior){.  
20e0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20  HANDLE hHeap;.. 
20f0: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2100: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
2110: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
2120: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
2130: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2140: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
2150: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
2160: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2170: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
2180: 41 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 48  ATE.  assert ( H
2190: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
21a0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
21b0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
21c0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
21d0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
21e0: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
21f0: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
2200: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
2210: 2a 2f 0a 20 20 69 66 28 20 21 48 65 61 70 46 72  */.  if( !HeapFr
2220: 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ee(hHeap, SQLITE
2230: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2240: 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20  S, pPrior) ){.  
2250: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
2260: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
2270: 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20  led to HeapFree 
2280: 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68  block %p (%d), h
2290: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
22a0: 20 70 50 72 69 6f 72 2c 20 47 65 74 4c 61 73 74   pPrior, GetLast
22b0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
22c0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hHeap);.  }.}../
22d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22e0: 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74  size of an exist
22f0: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
2300: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
2310: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
2320: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
2330: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  , int nBytes){. 
2340: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
2350: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
2360: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
2370: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
2380: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
2390: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
23a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
23b0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
23c0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64  LE_VALUE );.#ifd
23d0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
23e0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a  MALLOC_VALIDATE.
23f0: 20 20 61 73 73 65 72 74 20 28 20 48 65 61 70 56    assert ( HeapV
2400: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
2410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2420: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
2430: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
2440: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
2450: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
2460: 7b 0a 20 20 20 20 70 20 3d 20 48 65 61 70 41 6c  {.    p = HeapAl
2470: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
2480: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
2490: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
24a0: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
24b0: 20 20 70 20 3d 20 48 65 61 70 52 65 41 6c 6c 6f    p = HeapReAllo
24c0: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
24d0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
24e0: 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f  , pPrior, (SIZE_
24f0: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20  T)nBytes);.  }. 
2500: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73   if( !p ){.    s
2510: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
2520: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
2530: 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20   to %s %u bytes 
2540: 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  (%d), heap=%p",.
2550: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
2560: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
2570: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
2580: 79 74 65 73 2c 20 47 65 74 4c 61 73 74 45 72 72  ytes, GetLastErr
2590: 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 28 76  or(),.        (v
25a0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
25b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
25c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25d0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73   size of an outs
25e0: 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69  tanding allocati
25f0: 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f  on, in bytes..*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
2610: 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b  emSize(void *p){
2620: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
2630: 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20  .  SIZE_T n;..  
2640: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
2650: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
2660: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
2670: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
2680: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2690: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
26a0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
26b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
26c0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
26d0: 54 45 0a 20 20 61 73 73 65 72 74 20 28 20 48 65  TE.  assert ( He
26e0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
26f0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
2700: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
2710: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
2720: 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
2730: 20 20 6e 20 3d 20 48 65 61 70 53 69 7a 65 28 68    n = HeapSize(h
2740: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
2750: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
2760: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a  );.  if( n==(SIZ
2770: 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71  E_T)-1 ){.    sq
2780: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
2790: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
27a0: 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63  to HeapSize bloc
27b0: 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d  k %p (%d), heap=
27c0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 70 2c 20  %p",.        p, 
27d0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
27e0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
27f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2800: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
2810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
2820: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
2830: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
2840: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
2850: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
2860: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
2870: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
2880: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
2890: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
28a0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
28b0: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
28c0: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
28d0: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
28e0: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
28f0: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
2900: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
2910: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
2920: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2930: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
2940: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49  mData->magic==WI
2950: 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 20 20  NMEM_MAGIC );.  
2960: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
2970: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70  ->hHeap ){.    p
2980: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
2990: 70 20 3d 20 48 65 61 70 43 72 65 61 74 65 28 53  p = HeapCreate(S
29a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
29b0: 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
29e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
29f0: 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  IT_SIZE,.       
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2a20: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
2a30: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69 66  AX_SIZE);.    if
2a40: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
2a50: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73  hHeap ){.      s
2a60: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
2a70: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
2a80: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65     "failed to He
2a90: 61 70 43 72 65 61 74 65 20 28 25 64 29 2c 20 66  apCreate (%d), f
2aa0: 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a  lags=%u, initSiz
2ab0: 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25 75  e=%u, maxSize=%u
2ac0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 47 65 74  ",.          Get
2ad0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
2ae0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
2af0: 4c 41 47 53 2c 20 53 51 4c 49 54 45 5f 57 49 4e  LAGS, SQLITE_WIN
2b00: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
2b10: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E,.          SQL
2b20: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
2b30: 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  AX_SIZE);.      
2b40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2b50: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2b60: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
2b70: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 7d 0a 20  ed = TRUE;.  }. 
2b80: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
2b90: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
2ba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
2bb0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
2bc0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
2bd0: 41 4c 55 45 20 29 3b 0a 23 69 66 64 65 66 20 53  ALUE );.#ifdef S
2be0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
2bf0: 4f 43 5f 56 41 4c 49 44 41 54 45 0a 20 20 61 73  OC_VALIDATE.  as
2c00: 73 65 72 74 28 20 48 65 61 70 56 61 6c 69 64 61  sert( HeapValida
2c10: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
2c20: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
2c30: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
2c40: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
2c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69  OK;.}../*.** Dei
2c70: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
2c80: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
2c90: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
2ca0: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
2cb0: 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61  ata){.  winMemDa
2cc0: 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20  ta *pWinMemData 
2cd0: 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29  = (winMemData *)
2ce0: 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  pAppData;..  if(
2cf0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20   !pWinMemData ) 
2d00: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 57  return;.  if( pW
2d10: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
2d20: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d30: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
2d40: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
2d50: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 64  LE_VALUE );.#ifd
2d60: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2d70: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 0a  MALLOC_VALIDATE.
2d80: 20 20 20 20 61 73 73 65 72 74 28 20 48 65 61 70      assert( Heap
2d90: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
2da0: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
2db0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
2dc0: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
2dd0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57  endif.    if( pW
2de0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
2df0: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  d ){.      if( !
2e00: 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e  HeapDestroy(pWin
2e10: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20  MemData->hHeap) 
2e20: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e30: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
2e40: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
2e50: 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64 29  HeapDestroy (%d)
2e60: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
2e70: 20 20 20 20 20 20 20 20 47 65 74 4c 61 73 74 45          GetLastE
2e80: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
2e90: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
2ea0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
2eb0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
2ec0: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
2ed0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
2ee0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
2ef0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
2f00: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
2f10: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
2f20: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
2f30: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
2f40: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
2f50: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
2f60: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
2f70: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
2f80: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
2f90: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
2fa0: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
2fb0: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
2fc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2fd0: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
2fe0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
2ff0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
3000: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
3010: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
3020: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
3030: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
3040: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
3050: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
3060: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
3070: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
3080: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
3090: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
30a0: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
30b0: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
30c0: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
30d0: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
30e0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
30f0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
3100: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
3110: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
3120: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
3130: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
3140: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
3150: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
3160: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
3170: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
3180: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
3190: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
31a0: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
31b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
31c0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
31d0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
31e0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
31f0: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
3200: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
3210: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
3220: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
3230: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
3240: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
3250: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
3260: 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  *utf8ToUnicode(c
3270: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3280: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
3290: 61 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69  ar;.  WCHAR *zWi
32a0: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
32b0: 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65  Char = MultiByte
32c0: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
32d0: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
32e0: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
32f0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
3300: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a  = malloc( nChar*
3310: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
3320: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
3330: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
3340: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3350: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
3360: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
3370: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
3380: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
3390: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
33a0: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
33b0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72  har==0 ){.    fr
33c0: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
33d0: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
33e0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
33f0: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
3400: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
3410: 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74  onvert microsoft
3420: 20 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   unicode to UTF-
3430: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
3440: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
3450: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
3460: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
3470: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
3480: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
3490: 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a  8(const WCHAR *z
34a0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
34b0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
34c0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
34d0: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
34e0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
34f0: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
3500: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
3510: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  0, 0, 0);.  zFil
3520: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
3530: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
3540: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
3550: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3560: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
3570: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
3580: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
3590: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
35a0: 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a  ilename, nByte,.
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
35d0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
35e0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65   == 0 ){.    fre
35f0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
3600: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
3610: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
3620: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
3630: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e 73  * Convert an ans
3640: 69 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72  i string to micr
3650: 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20 62  osoft unicode, b
3660: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
3670: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
3680: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
3690: 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53  e apis..** .** S
36a0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
36b0: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
36c0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
36d0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
36e0: 73 74 61 74 69 63 20 57 43 48 41 52 20 2a 6d 62  static WCHAR *mb
36f0: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
3700: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
3710: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
3720: 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62 63 73 46  .  WCHAR *zMbcsF
3730: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
3740: 6f 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c  odepage = AreFil
3750: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
3760: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
3770: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74  ..  nByte = Mult
3780: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
3790: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
37a0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
37b0: 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  ,0)*sizeof(WCHAR
37c0: 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  );.  zMbcsFilena
37d0: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
37e0: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
37f0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
3800: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
3810: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
3820: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
3830: 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  te = MultiByteTo
3840: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
3850: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
3860: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
3870: 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  me, nByte);.  if
3880: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
3890: 20 20 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65    free(zMbcsFile
38a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
38b0: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
38c0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
38d0: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
38e0: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f  ** Convert micro
38f0: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20  soft unicode to 
3900: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
3910: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
3920: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
3930: 27 73 20 41 6e 73 69 20 63 6f 64 65 70 61 67 65  's Ansi codepage
3940: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
3950: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
3960: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
3970: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
3980: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
3990: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
39a0: 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57 43 48 41  oMbcs(const WCHA
39b0: 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  R *zWideFilename
39c0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
39d0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
39e0: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
39f0: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
3a00: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
3a10: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
3a20: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
3a30: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
3a40: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
3a50: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
3a60: 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  0, 0);.  zFilena
3a70: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
3a80: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
3a90: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
3aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3ab0: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
3ac0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
3ad0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
3ae0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
3af0: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
3b20: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
3b30: 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  = 0 ){.    free(
3b40: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
3b50: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
3b60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
3b70: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
3b80: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
3b90: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
3ba0: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
3bb0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
3bc0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
3bd0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
3be0: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
3bf0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
3c00: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
3c10: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
3c20: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
3c30: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
3c40: 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69  .  WCHAR *zTmpWi
3c50: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
3c60: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
3c70: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
3c80: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
3c90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
3ca0: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
3cb0: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
3cc0: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
3cd0: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
3ce0: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
3cf0: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
3d00: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
3d10: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
3d20: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
3d30: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
3d40: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
3d50: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
3d60: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
3d70: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
3d80: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
3d90: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
3da0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
3db0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  ar *zFilenameMbc
3dc0: 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70  s;.  WCHAR *zTmp
3dd0: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
3de0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
3df0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
3e00: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
3e10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
3e20: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
3e30: 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Mbcs = unicodeTo
3e40: 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Mbcs(zTmpWide);.
3e50: 20 20 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29    free(zTmpWide)
3e60: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
3e70: 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a  nameMbcs;.}.../*
3e80: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
3e90: 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45  alue of getLastE
3ea0: 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65  rrorMsg.** is ze
3eb0: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
3ec0: 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
3ed0: 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
3ee0: 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
3ef0: 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
3f00: 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
3f10: 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed)..*/.static i
3f20: 6e 74 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  nt getLastErrorM
3f30: 73 67 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  sg(int nBuf, cha
3f40: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46  r *zBuf){.  /* F
3f50: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74  ormatMessage ret
3f60: 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72  urns 0 on failur
3f70: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74  e.  Otherwise it
3f80: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68  .  ** returns th
3f90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41  e number of TCHA
3fa0: 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  Rs written to th
3fb0: 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75  e output.  ** bu
3fc0: 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20  ffer, excluding 
3fd0: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  the terminating 
3fe0: 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a  null char..  */.
3ff0: 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20    DWORD error = 
4000: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
4010: 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20    DWORD dwLen = 
4020: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  0;.  char *zOut 
4030: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54  = 0;..  if( isNT
4040: 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20  () ){.    WCHAR 
4050: 2a 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c  *zTempWide = NUL
4060: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 46  L;.    dwLen = F
4070: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
4080: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
4090: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 20 46  OCATE_BUFFER | F
40a0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
40b0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52 4d  OM_SYSTEM | FORM
40c0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
40d0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40f0: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a 20 20         error,.  
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4130: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20         (LPWSTR) 
4160: 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20  &zTempWide,.    
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41a0: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
41b0: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
41c0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
41d0: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
41e0: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
41f0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69        zOut = uni
4200: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
4210: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Wide);.      /* 
4220: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
4230: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
4240: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
4250: 65 20 2a 2f 0a 20 20 20 20 20 20 4c 6f 63 61 6c  e */.      Local
4260: 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b  Free(zTempWide);
4270: 0a 20 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29  .    }./* isNT()
4280: 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
4290: 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
42a0: 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
42b0: 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a  er executed. .**
42c0: 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49   Since the ASCII
42d0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73   version of thes
42e0: 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f  e Windows API do
42f0: 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57   not exist for W
4300: 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d  INCE,.** it's im
4310: 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72  portant to not r
4320: 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f  eference them fo
4330: 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a  r WINCE builds..
4340: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
4350: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
4360: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
4370: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
4380: 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65 73  wLen = FormatMes
4390: 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53  sageA(FORMAT_MES
43a0: 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55  SAGE_ALLOCATE_BU
43b0: 46 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d 45  FFER | FORMAT_ME
43c0: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
43d0: 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41  M | FORMAT_MESSA
43e0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
43f0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
4410: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
4430: 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  rror,.          
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4450: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4470: 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20  LPSTR) &zTemp,. 
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
44c0: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
44d0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
44e0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
44f0: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
4500: 2a 2f 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  */.      zOut = 
4510: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
4520: 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
4530: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  );.      /* free
4540: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
4550: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
4560: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
4570: 0a 20 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65  .      LocalFree
4580: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 23  (zTemp);.    }.#
4590: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20  endif.  }.  if( 
45a0: 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20  0 == dwLen ){.  
45b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
45c0: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
45d0: 4f 73 45 72 72 6f 72 20 30 78 25 78 20 28 25 75  OsError 0x%x (%u
45e0: 29 22 2c 20 65 72 72 6f 72 2c 20 65 72 72 6f 72  )", error, error
45f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4600: 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75  /* copy a maximu
4610: 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20  m of nBuf chars 
4620: 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  to output buffer
4630: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
4640: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
4650: 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  Buf, "%s", zOut)
4660: 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68  ;.    /* free th
4670: 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f  e UTF8 buffer */
4680: 0a 20 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b  .    free(zOut);
4690: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
46a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  .}../*.**.** Thi
46b0: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e  s function - win
46c0: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29  LogErrorAtLine()
46d0: 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20   - is only ever 
46e0: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
46f0: 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72  acro.** winLogEr
4700: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ror()..**.** Thi
4710: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
4720: 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72  oked after an er
4730: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e  ror occurs in an
4740: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OS function..**
4750: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
4760: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
4770: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
4780: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
4790: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20  lue of.** error 
47a0: 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73  code and, if pos
47b0: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
47c0: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
47d0: 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f  lent from .** Fo
47e0: 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a  rmatMessage..**.
47f0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
4800: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
4810: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
4820: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
4830: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
4840: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
4850: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
4860: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
4870: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
4880: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
4890: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
48a0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
48b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
48c0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
48d0: 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65  * failed and the
48e0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
48f0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
4900: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
4910: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
4920: 28 61 2c 62 2c 63 29 20 20 20 20 20 77 69 6e 4c  (a,b,c)     winL
4930: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
4940: 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74  b,c,__LINE__).st
4950: 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45  atic int winLogE
4960: 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e  rrorAtLine(.  in
4970: 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20  t errcode,      
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4990: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
49a0: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
49b0: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
49c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
49d0: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
49e0: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
49f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
4a00: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
4a10: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
4a20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
4a30: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
4a40: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
4a50: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
4a60: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
4a70: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
4a80: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
4a90: 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20  zMsg[500];      
4aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75             /* Hu
4ab0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72  man readable err
4ac0: 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  or text */.  int
4ad0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4af0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
4b00: 20 20 44 57 4f 52 44 20 69 45 72 72 6e 6f 20 3d    DWORD iErrno =
4b10: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
4b20: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
4b30: 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20  */..  zMsg[0] = 
4b40: 30 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f  0;.  getLastErro
4b50: 72 4d 73 67 28 73 69 7a 65 6f 66 28 7a 4d 73 67  rMsg(sizeof(zMsg
4b60: 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65  ), zMsg);.  asse
4b70: 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c  rt( errcode!=SQL
4b80: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
4b90: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
4ba0: 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30   = "";.  for(i=0
4bb0: 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73  ; zMsg[i] && zMs
4bc0: 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d  g[i]!='\r' && zM
4bd0: 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b  sg[i]!='\n'; i++
4be0: 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20  ){}.  zMsg[i] = 
4bf0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  0;.  sqlite3_log
4c00: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
4c10: 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25  "os_win.c:%d: (%
4c20: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
4c30: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
4c40: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
4c50: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
4c60: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
4c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
4c80: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
4c90: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
4ca0: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
4cb0: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
4cc0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
4cd0: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
4ce0: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
4cf0: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
4d00: 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73   .** antivirus s
4d10: 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74  oftware.  Also t
4d20: 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79  he initial delay
4d30: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
4d40: 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20  t retry..** The 
4d50: 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20  delay increases 
4d60: 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61  linearly with ea
4d70: 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66  ch retry..*/.#if
4d80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
4d90: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20  2_IOERR_RETRY.# 
4da0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
4db0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20  N32_IOERR_RETRY 
4dc0: 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  10.#endif.#ifnde
4dd0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
4de0: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
4df0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
4e00: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
4e10: 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64  RY_DELAY 25.#end
4e20: 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  if.static int wi
4e30: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20  n32IoerrRetry = 
4e40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
4e50: 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63  RR_RETRY;.static
4e60: 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52   int win32IoerrR
4e70: 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49  etryDelay = SQLI
4e80: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
4e90: 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a  ETRY_DELAY;../*.
4ea0: 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65  ** If a ReadFile
4eb0: 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28  () or WriteFile(
4ec0: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
4ed0: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
4ee0: 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ine.** to see if
4ef0: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
4f00: 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54  tried.  Return T
4f10: 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52  RUE to retry.  R
4f20: 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74  eturn FALSE.** t
4f30: 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61  o give up with a
4f40: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
4f50: 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65 72  ic int retryIoer
4f60: 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 29 7b  r(int *pnRetry){
4f70: 0a 20 20 44 57 4f 52 44 20 65 3b 0a 20 20 69 66  .  DWORD e;.  if
4f80: 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 33  ( *pnRetry>=win3
4f90: 32 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20  2IoerrRetry ){. 
4fa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4fb0: 0a 20 20 65 20 3d 20 47 65 74 4c 61 73 74 45 72  .  e = GetLastEr
4fc0: 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 65 3d 3d  ror();.  if( e==
4fd0: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
4fe0: 49 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  IED ||.      e==
4ff0: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
5000: 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d  TION ||.      e=
5010: 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56  =ERROR_SHARING_V
5020: 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20  IOLATION ){.    
5030: 53 6c 65 65 70 28 77 69 6e 33 32 49 6f 65 72 72  Sleep(win32Ioerr
5040: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
5050: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
5060: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
5070: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
5080: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5090: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
50a0: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
50b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
50c0: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
50d0: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
50e0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
50f0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
5100: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
5110: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
5120: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
5130: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
5140: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
5150: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
5160: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
5170: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
5180: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
5190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
51d0: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
51e0: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
51f0: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
5200: 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45  ./*.** WindowsCE
5210: 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
5220: 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e   localtime() fun
5230: 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74  ction.  So creat
5240: 65 20 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74  e a.** substitut
5250: 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  e..*/.#include <
5260: 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74  time.h>.struct t
5270: 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c  m *__cdecl local
5280: 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f  time(const time_
5290: 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63  t *t).{.  static
52a0: 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20   struct tm y;.  
52b0: 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54  FILETIME uTm, lT
52c0: 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  m;.  SYSTEMTIME 
52d0: 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  pTm;.  sqlite3_i
52e0: 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20  nt64 t64;.  t64 
52f0: 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74  = *t;.  t64 = (t
5300: 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30  64 + 11644473600
5310: 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54  )*10000000;.  uT
5320: 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20  m.dwLowDateTime 
5330: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20  = (DWORD)(t64 & 
5340: 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75  0xFFFFFFFF);.  u
5350: 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  Tm.dwHighDateTim
5360: 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e  e= (DWORD)(t64 >
5370: 3e 20 33 32 29 3b 0a 20 20 46 69 6c 65 54 69 6d  > 32);.  FileTim
5380: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
5390: 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46  (&uTm,&lTm);.  F
53a0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
53b0: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
53c0: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
53d0: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
53e0: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
53f0: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
5400: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
5410: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
5420: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
5430: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
5440: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
5450: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
5460: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
5470: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
5480: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a    return &y;.}..
5490: 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 6e 65 76  /* This will nev
54a0: 65 72 20 62 65 20 63 61 6c 6c 65 64 2c 20 62 75  er be called, bu
54b0: 74 20 64 65 66 69 6e 65 64 20 74 6f 20 6d 61 6b  t defined to mak
54c0: 65 20 74 68 65 20 63 6f 64 65 20 63 6f 6d 70 69  e the code compi
54d0: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65  le */.#define Ge
54e0: 74 54 65 6d 70 50 61 74 68 41 28 61 2c 62 29 0a  tTempPathA(a,b).
54f0: 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c  .#define LockFil
5500: 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20  e(a,b,c,d,e)    
5510: 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65     winceLockFile
5520: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29  (&a, b, c, d, e)
5530: 0a 23 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46  .#define UnlockF
5540: 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20  ile(a,b,c,d,e)  
5550: 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69     winceUnlockFi
5560: 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20  le(&a, b, c, d, 
5570: 65 29 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46  e).#define LockF
5580: 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c  ileEx(a,b,c,d,e,
5590: 66 29 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69  f)   winceLockFi
55a0: 6c 65 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64  leEx(&a, b, c, d
55b0: 2c 20 65 2c 20 66 29 0a 0a 23 64 65 66 69 6e 65  , e, f)..#define
55c0: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
55d0: 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29  LE(a) (winFile*)
55e0: 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e  &((char*)a)[-(in
55f0: 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69  t)offsetof(winFi
5600: 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63  le,h)]../*.** Ac
5610: 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20  quire a lock on 
5620: 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a  the handle h.*/.
5630: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
5640: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41  eMutexAcquire(HA
5650: 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52  NDLE h){.   DWOR
5660: 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b  D dwErr;.   do {
5670: 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20 57 61  .     dwErr = Wa
5680: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
5690: 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  t(h, INFINITE);.
56a0: 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72     } while (dwEr
56b0: 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54  r != WAIT_OBJECT
56c0: 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57  _0 && dwErr != W
56d0: 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a  AIT_ABANDONED);.
56e0: 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  }./*.** Release 
56f0: 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20  a lock acquired 
5700: 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  by winceMutexAcq
5710: 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e  uire().*/.#defin
5720: 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65  e winceMutexRele
5730: 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75  ase(h) ReleaseMu
5740: 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72  tex(h)../*.** Cr
5750: 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  eate the mutex a
5760: 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  nd shared memory
5770: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
5780: 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  g in the file.**
5790: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
57a0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
57b0: 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
57c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
57d0: 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20  lename, winFile 
57e0: 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43 48 41 52  *pFile){.  WCHAR
57f0: 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48 41 52 20   *zTok;.  WCHAR 
5800: 2a 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f 55  *zName = utf8ToU
5810: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
5820: 29 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20  );.  BOOL bInit 
5830: 3d 20 54 52 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e  = TRUE;..  /* In
5840: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
5850: 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
5860: 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 26 70 46 69   ZeroMemory(&pFi
5870: 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f  le->local, sizeo
5880: 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29  f(pFile->local))
5890: 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20  ;..  /* Replace 
58a0: 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20  the backslashes 
58b0: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d  from the filenam
58c0: 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20  e and lowercase 
58d0: 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76  it.  ** to deriv
58e0: 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20  e a mutex name. 
58f0: 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43 68 61 72  */.  zTok = Char
5900: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
5910: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
5920: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
5930: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
5940: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
5950: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
5960: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
5970: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
5980: 65 78 20 3d 20 43 72 65 61 74 65 4d 75 74 65 78  ex = CreateMutex
5990: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
59a0: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
59b0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
59c0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
59d0: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
59e0: 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  r();.    winLogE
59f0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
5a00: 52 2c 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c  R, "winceCreateL
5a10: 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock1", zFilename
5a20: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 6d  );.    free(zNam
5a30: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  e);.    return F
5a40: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ALSE;.  }..  /* 
5a50: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
5a60: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
5a70: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
5a80: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
5a90: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
5aa0: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
5ab0: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
5ac0: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
5ad0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
5ae0: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
5af0: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
5b00: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
5b10: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
5b20: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
5b30: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
5b40: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
5b50: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
5b60: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61  name..  */.  Cha
5b70: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
5b80: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
5b90: 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70   = CreateFileMap
5ba0: 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41  pingW(INVALID_HA
5bb0: 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c  NDLE_VALUE, NULL
5bc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5be0: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
5bf0: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
5c00: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a        zName);  .
5c40: 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
5c50: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
5c60: 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
5c70: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
5c80: 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a  mory so it .  **
5c90: 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e   must be zero-in
5ca0: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
5cb0: 66 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  f (GetLastError(
5cc0: 29 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  ) == ERROR_ALREA
5cd0: 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
5ce0: 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
5cf0: 20 7d 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d 65   }..  free(zName
5d00: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73  );..  /* If we s
5d10: 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69  ucceeded in maki
5d20: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
5d30: 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70  mory handle, map
5d40: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46   it. */.  if (pF
5d50: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20  ile->hShared){. 
5d60: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
5d70: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 4d   = (winceLock*)M
5d80: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
5d90: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
5da0: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
5db0: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
5dc0: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
5dd0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
5de0: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
5df0: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
5e00: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
5e10: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
5e20: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
5e30: 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72  if (!pFile->shar
5e40: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
5e50: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
5e60: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
5e70: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
5e80: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 77  SQLITE_ERROR, "w
5e90: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22  inceCreateLock2"
5ea0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
5eb0: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
5ec0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b  pFile->hShared);
5ed0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53  .      pFile->hS
5ee0: 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hared = NULL;.  
5ef0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
5f00: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
5f10: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61  ould not be crea
5f20: 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20  ted, then close 
5f30: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61  the mutex and fa
5f40: 69 6c 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  il */.  if (pFil
5f50: 65 2d 3e 68 53 68 61 72 65 64 20 3d 3d 20 4e 55  e->hShared == NU
5f60: 4c 4c 29 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75  LL){.    winceMu
5f70: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
5f80: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 43  ->hMutex);.    C
5f90: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
5fa0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70  ->hMutex);.    p
5fb0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e  File->hMutex = N
5fc0: 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ULL;.    return 
5fd0: 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20  FALSE;.  }.  .  
5fe0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
5ff0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
6000: 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65  if we're suppose
6010: 64 20 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49  d to */.  if (bI
6020: 6e 69 74 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d  nit) {.    ZeroM
6030: 65 6d 6f 72 79 28 70 46 69 6c 65 2d 3e 73 68 61  emory(pFile->sha
6040: 72 65 64 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  red, sizeof(winc
6050: 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20  eLock));.  }..  
6060: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
6070: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
6080: 3b 0a 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ;.  return TRUE;
6090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
60a0: 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
60b0: 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
60c0: 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
60d0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
60e0: 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
60f0: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
6100: 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
6110: 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
6120: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
6130: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
6140: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
6150: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
6160: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
6170: 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
6180: 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
6190: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
61a0: 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
61b0: 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
61c0: 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
61d0: 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
61e0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
61f0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
6200: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
6210: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
6220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
6230: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
6240: 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
6250: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
6260: 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
6270: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
6280: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
6290: 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
62a0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
62b0: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
62c0: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
62d0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
62e0: 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
62f0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
6300: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
6310: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
6320: 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
6330: 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
6340: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
6350: 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
6360: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
6370: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
6380: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
6390: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b  pFile->hShared);
63a0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69  ..    /* Done wi
63b0: 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  th the mutex */.
63c0: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
63d0: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
63e0: 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 43 6c  tex);    .    Cl
63f0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
6400: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
6410: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
6420: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  LL;.  }.}../* .*
6430: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
6440: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
6450: 69 6c 65 28 29 20 41 50 49 20 6f 66 20 77 69 6e  ile() API of win
6460: 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a  dows for wince.*
6470: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
6480: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  nceLockFile(.  H
6490: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
64a0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
64b0: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
64c0: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
64d0: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
64e0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
64f0: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
6500: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
6510: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
6520: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
6530: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
6540: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
6550: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
6560: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6570: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
6580: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
6590: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
65a0: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
65b0: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
65c0: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
65d0: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
65e0: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
65f0: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
6600: 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
6610: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
6620: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
6630: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
6640: 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
6650: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
6660: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
6670: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
6680: 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
6690: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
66a0: 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
66b0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
66c0: 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
66d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
66e0: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
66f0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
6700: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
6710: 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
6720: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
6730: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
6740: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
6750: 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
6760: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
6770: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
6780: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
6790: 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
67a0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
67b0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
67c0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
67d0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
67e0: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
67f0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
6800: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
6810: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
6820: 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
6830: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
6840: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
6850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6860: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
6870: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6880: 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
6890: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
68a0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
68b0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
68c0: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
68d0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
68e0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
68f0: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
6900: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
6910: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
6920: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
6930: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
6940: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
6950: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
6960: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
6970: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
6980: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
6990: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
69a0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
69b0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
69c0: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
69d0: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
69e0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
69f0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
6a00: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  D)RESERVED_BYTE 
6a10: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
6a20: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
6a30: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
6a40: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
6a50: 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
6a60: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
6a70: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
6a80: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
6a90: 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
6aa0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
6ab0: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
6ac0: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
6ad0: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
6ae0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
6af0: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
6b00: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
6b10: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
6b20: 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
6b30: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
6b40: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
6b50: 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
6b60: 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68  le(.  HANDLE *ph
6b70: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
6b80: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20  FileOffsetLow,. 
6b90: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
6ba0: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
6bb0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
6bc0: 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  oUnlockLow,.  DW
6bd0: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
6be0: 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29  esToUnlockHigh.)
6bf0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
6c00: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
6c10: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
6c20: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
6c30: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
6c40: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
6c50: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
6c60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
6c70: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
6c80: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a  ToUnlockHigh);..
6c90: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
6ca0: 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
6cb0: 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
6cc0: 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
6cd0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  utex);..  /* Rel
6ce0: 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20  easing a reader 
6cf0: 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75  lock or an exclu
6d00: 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  sive lock */.  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 53 48 41  ow == (DWORD)SHA
6d30: 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20  RED_FIRST){.    
6d40: 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61  /* Did we have a
6d50: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
6d60: 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  ? */.    if (pFi
6d70: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
6d80: 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73  sive){.      ass
6d90: 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
6da0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
6db0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
6dc0: 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  IZE);.      pFil
6dd0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
6de0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
6df0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
6e00: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  ->bExclusive = F
6e10: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
6e20: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
6e30: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  }..    /* Did we
6e40: 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61   just have a rea
6e50: 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  der lock? */.   
6e60: 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d   else if (pFile-
6e70: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29  >local.nReaders)
6e80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
6e90: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
6ea0: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
6eb0: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c  RD)SHARED_SIZE |
6ec0: 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
6ed0: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
6ee0: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
6ef0: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
6f00: 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
6f10: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
6f20: 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
6f30: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
6f40: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
6f50: 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
6f60: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
6f70: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
6f80: 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
6f90: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
6fa0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
6fb0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
6fc0: 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
6fd0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
6fe0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
6ff0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
7000: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
7010: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
7020: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
7030: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
7040: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
7050: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
7060: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
7070: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
7080: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
7090: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
70a0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
70b0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
70c0: 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
70d0: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
70e0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
70f0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
7100: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
7110: 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20  Reserved) {.    
7120: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
7130: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
7140: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
7150: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
7160: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
7170: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
7180: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
7190: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
71a0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
71b0: 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
71c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
71d0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
71e0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
71f0: 41 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66  API of windows f
7200: 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74  or wince.*/.stat
7210: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63  ic BOOL winceLoc
7220: 6b 46 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c  kFileEx(.  HANDL
7230: 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  E *phFile,.  DWO
7240: 52 44 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57  RD dwFlags,.  DW
7250: 4f 52 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a  ORD dwReserved,.
7260: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
7270: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
7280: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
7290: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
72a0: 68 2c 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45  h,.  LPOVERLAPPE
72b0: 44 20 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29  D lpOverlapped.)
72c0: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
72d0: 45 54 45 52 28 64 77 52 65 73 65 72 76 65 64 29  ETER(dwReserved)
72e0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
72f0: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
7300: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
7310: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c  .  /* If the cal
7320: 6c 65 72 20 77 61 6e 74 73 20 61 20 73 68 61 72  ler wants a shar
7330: 65 64 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f  ed read lock, fo
7340: 72 77 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a  rward this call.
7350: 20 20 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63    ** to winceLoc
7360: 6b 46 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c  kFile */.  if (l
7370: 70 4f 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66  pOverlapped->Off
7380: 73 65 74 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  set == (DWORD)SH
7390: 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
73a0: 20 20 20 20 64 77 46 6c 61 67 73 20 3d 3d 20 31      dwFlags == 1
73b0: 20 26 26 0a 20 20 20 20 20 20 6e 4e 75 6d 62 65   &&.      nNumbe
73c0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
73d0: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
73e0: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72 65  ED_SIZE){.    re
73f0: 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69  turn winceLockFi
7400: 6c 65 28 70 68 46 69 6c 65 2c 20 53 48 41 52 45  le(phFile, SHARE
7410: 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30  D_FIRST, 0, 1, 0
7420: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7430: 46 41 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  FALSE;.}./*.** E
7440: 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
7450: 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
7460: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
74b0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
74c0: 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
74d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
7520: 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
7530: 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65  f routines imple
7540: 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74  ment the I/O met
7550: 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a  hods specified.*
7560: 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  * by the sqlite3
7570: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
7580: 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ct..************
7590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
75d0: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20  **/../*.** Some 
75e0: 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c  microsoft compil
75f0: 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65  ers lack this de
7600: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  finition..*/.#if
7610: 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54  ndef INVALID_SET
7620: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20  _FILE_POINTER.# 
7630: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53  define INVALID_S
7640: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  ET_FILE_POINTER 
7650: 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64  ((DWORD)-1).#end
7660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
7670: 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
7680: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ion of the file 
7690: 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73  handle passed as
76a0: 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
76b0: 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
76c0: 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
76d0: 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
76e0: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
76f0: 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73   0. .** Otherwis
7700: 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61  e, set pFile->la
7710: 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75  stErrno and retu
7720: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
7730: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57  static int seekW
7740: 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  inFile(winFile *
7750: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
7760: 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 20  nt64 iOffset){. 
7770: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b   LONG upperBits;
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32   /* Most sig. 32
77a0: 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
77b0: 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f  set */.  LONG lo
77c0: 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  werBits;        
77d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73           /* Leas
77e0: 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
77f0: 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
7800: 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20    DWORD dwRet;  
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
7830: 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
7840: 69 6e 74 65 72 28 29 20 2a 2f 0a 0a 20 20 75 70  inter() */..  up
7850: 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
7860: 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26  ((iOffset>>32) &
7870: 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
7880: 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  lowerBits = (LON
7890: 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66  G)(iOffset & 0xf
78a0: 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20  fffffff);..  /* 
78b0: 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73  API oddity: If s
78c0: 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69  uccessful, SetFi
78d0: 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75  lePointer() retu
78e0: 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a  rns a dword .  *
78f0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7900: 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
7910: 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
7920: 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
7930: 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
7940: 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
7950: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
7960: 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
7970: 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20  ing to MSDN, .  
7980: 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ** INVALID_SET_F
7990: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20  ILE_POINTER may 
79a0: 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20  also be a valid 
79b0: 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74  new offset. So t
79c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
79d0: 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72  * whether an err
79e0: 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  or has actually 
79f0: 6f 63 63 75 72 65 64 2c 20 69 74 20 69 73 20 61  occured, it is a
7a00: 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f  lso necessary to
7a10: 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c   call .  ** GetL
7a20: 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f  astError()..  */
7a30: 0a 20 20 64 77 52 65 74 20 3d 20 53 65 74 46 69  .  dwRet = SetFi
7a40: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
7a50: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
7a60: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
7a70: 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 28 64  BEGIN);.  if( (d
7a80: 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  wRet==INVALID_SE
7a90: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26  T_FILE_POINTER &
7aa0: 26 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  & GetLastError()
7ab0: 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20  !=NO_ERROR) ){. 
7ac0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
7ad0: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
7ae0: 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
7af0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
7b00: 52 52 5f 53 45 45 4b 2c 20 22 73 65 65 6b 57 69  RR_SEEK, "seekWi
7b10: 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  nFile", pFile->z
7b20: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
7b30: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  n 1;.  }..  retu
7b40: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
7b50: 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
7b60: 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
7b70: 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
7b80: 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
7b90: 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
7ba0: 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
7bb0: 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
7bc0: 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
7bd0: 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20 69 73  , but windows is
7be0: 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
7bf0: 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
7c00: 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
7c10: 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
7c20: 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
7c30: 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
7c40: 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
7c50: 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
7c60: 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
7c70: 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
7c80: 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
7c90: 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
7ca0: 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
7cb0: 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
7cc0: 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
7cd0: 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
7ce0: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
7cf0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
7d00: 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
7d10: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
7d20: 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
7d30: 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
7d40: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
7d50: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
7d60: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
7d70: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
7d80: 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f  ->pShm==0 );.  O
7d90: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
7da0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
7db0: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ;.  do{.    rc =
7dc0: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69   CloseHandle(pFi
7dd0: 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53  le->h);.    /* S
7de0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
7df0: 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f  rc=0; cnt=MX_CLO
7e00: 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a  SE_ATTEMPT; ); *
7e10: 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  /.  }while( rc==
7e20: 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f  0 && ++cnt < MX_
7e30: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26  CLOSE_ATTEMPT &&
7e40: 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29   (Sleep(100), 1)
7e50: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
7e60: 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
7e70: 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
7e80: 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
7e90: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
7ea0: 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
7eb0: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
7ec0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
7ed0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
7ee0: 20 20 20 20 20 20 20 20 20 20 20 44 65 6c 65 74             Delet
7ef0: 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44  eFileW(pFile->zD
7f00: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30  eleteOnClose)==0
7f10: 0a 20 20 20 20 20 20 20 20 26 26 20 47 65 74 46  .        && GetF
7f20: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
7f30: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
7f40: 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
7f50: 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  f .        && cn
7f60: 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
7f70: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
7f80: 20 20 29 7b 0a 20 20 20 20 20 20 20 53 6c 65 65    ){.       Slee
7f90: 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74  p(100);  /* Wait
7fa0: 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65   a little before
7fb0: 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f   trying again */
7fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
7fd0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
7fe0: 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  Close);.  }.#end
7ff0: 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
8000: 4c 4f 53 45 20 25 64 20 25 73 5c 6e 22 2c 20 70  LOSE %d %s\n", p
8010: 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f  File->h, rc ? "o
8020: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
8030: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
8040: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20  1);.  return rc 
8050: 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  ? SQLITE_OK.    
8060: 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67          : winLog
8070: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
8080: 52 52 5f 43 4c 4f 53 45 2c 20 22 77 69 6e 43 6c  RR_CLOSE, "winCl
8090: 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
80a0: 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
80b0: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
80c0: 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
80d0: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
80e0: 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
80f0: 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
8100: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
8110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
8120: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
8130: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
8140: 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
8150: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
8160: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
8170: 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
8180: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
8190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
81a0: 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
81b0: 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
81c0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
81f0: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
8200: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
8210: 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
8220: 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
8230: 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
8240: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
8250: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
8260: 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61  )id;  /* file ha
8270: 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  ndle */.  DWORD 
8280: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
8290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
82a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
82b0: 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
82c0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  file */.  int nR
82d0: 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
82e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
82f0: 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f  ber of retrys */
8300: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
8310: 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
8320: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
8330: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29  LITE_IOERR_READ)
8340: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
8350: 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  AD %d lock=%d\n"
8360: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
8370: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
8380: 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c    if( seekWinFil
8390: 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
83a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
83b0: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
83c0: 20 20 77 68 69 6c 65 28 20 21 52 65 61 64 46 69    while( !ReadFi
83d0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
83e0: 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
83f0: 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  0) ){.    if( re
8400: 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
8410: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
8420: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
8430: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
8440: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
8450: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
8460: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 22  TE_IOERR_READ, "
8470: 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
8480: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c  >zPath);.  }.  l
8490: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
84a0: 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57  .  if( nRead<(DW
84b0: 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f  ORD)amt ){.    /
84c0: 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
84d0: 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
84e0: 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
84f0: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
8500: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52  ((char*)pBuf)[nR
8510: 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65  ead], 0, amt-nRe
8520: 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ad);.    return 
8530: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
8540: 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
8550: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
8570: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
8580: 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
8590: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
85a0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
85b0: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
85c0: 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
85d0: 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
85e0: 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
85f0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
8600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8610: 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
8620: 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
8630: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8650: 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
8660: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
8670: 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
8680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8690: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
86a0: 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
86b0: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
86d0: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
86e0: 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
86f0: 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
8700: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
8730: 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c   has occured, el
8740: 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
8750: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
8760: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
8770: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
8780: 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
8790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
87a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
87b0: 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
87c0: 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
87d0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
87e0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
87f0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
8800: 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
8810: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
8820: 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
8830: 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
8840: 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25  STRACE(("WRITE %
8850: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
8860: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
8870: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 72 63  ocktype));..  rc
8880: 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70   = seekWinFile(p
8890: 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  File, offset);. 
88a0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
88b0: 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38    u8 *aRem = (u8
88c0: 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20   *)pBuf;        
88d0: 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62  /* Data yet to b
88e0: 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
88f0: 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b   int nRem = amt;
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8910: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8920: 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  s yet to be writ
8930: 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ten */.    DWORD
8940: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
8950: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
8960: 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63  s written by eac
8970: 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61  h WriteFile() ca
8980: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65  ll */..    while
8990: 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
89a0: 20 20 69 66 28 20 21 57 72 69 74 65 46 69 6c 65    if( !WriteFile
89b0: 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
89c0: 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
89d0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  0) ){.        if
89e0: 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52  ( retryIoerr(&nR
89f0: 65 74 72 79 29 20 29 20 63 6f 6e 74 69 6e 75 65  etry) ) continue
8a00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
8a10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8a20: 66 28 20 6e 57 72 69 74 65 3c 3d 30 20 29 20 62  f( nWrite<=0 ) b
8a30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 52 65 6d  reak;.      aRem
8a40: 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
8a50: 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65    nRem -= nWrite
8a60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8a70: 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
8a80: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8a90: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
8aa0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
8ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
8ac0: 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
8ad0: 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
8ae0: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
8af0: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
8b00: 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
8b10: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
8b20: 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
8b30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8b40: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
8b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
8b60: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
8b70: 4f 45 52 52 5f 57 52 49 54 45 2c 20 22 77 69 6e  OERR_WRITE, "win
8b80: 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  Write", pFile->z
8b90: 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
8ba0: 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65      logIoerr(nRe
8bb0: 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  try);.  }.  retu
8bc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8bd0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
8be0: 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
8bf0: 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
8c00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
8c10: 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
8c20: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
8c30: 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
8c40: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
8c50: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
8c60: 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
8c70: 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
8c80: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8c90: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
8ca0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
8cb0: 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
8cc0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
8cd0: 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41  File );..  OSTRA
8ce0: 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE(("TRUNCATE %d
8cf0: 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %lld\n", pFile-
8d00: 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53  >h, nByte));.  S
8d10: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
8d20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
8d30: 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20  RR_TRUNCATE);.. 
8d40: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
8d50: 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
8d60: 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
8d70: 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
8d80: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
8d90: 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
8da0: 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
8db0: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
8dc0: 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
8dd0: 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
8de0: 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
8df0: 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
8e00: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
8e10: 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
8e20: 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
8e30: 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
8e40: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
8e50: 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
8e60: 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
8e70: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
8e80: 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
8e90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e  .  }..  /* SetEn
8ea0: 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e  dOfFile() return
8eb0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20  s non-zero when 
8ec0: 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a  successful, or z
8ed0: 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c  ero when it fail
8ee0: 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b  s. */.  if( seek
8ef0: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e  WinFile(pFile, n
8f00: 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20  Byte) ){.    rc 
8f10: 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
8f20: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
8f30: 41 54 45 2c 20 22 77 69 6e 54 72 75 6e 63 61 74  ATE, "winTruncat
8f40: 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
8f50: 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
8f60: 30 3d 3d 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  0==SetEndOfFile(
8f70: 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20 20  pFile->h) ){.   
8f80: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
8f90: 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
8fa0: 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  ();.    rc = win
8fb0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
8fc0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
8fd0: 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20  "winTruncate2", 
8fe0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
8ff0: 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
9000: 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64  TRUNCATE %d %lld
9010: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
9020: 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22 66  , nByte, rc ? "f
9030: 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
9040: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
9060: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
9070: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
9080: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
9090: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
90a0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
90b0: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
90c0: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
90d0: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
90e0: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
90f0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
9100: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
9110: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
9120: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
9130: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
9140: 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
9150: 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
9160: 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
9170: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
9180: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
9190: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
91a0: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
91b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
91c0: 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _SYNC.  /*.  ** 
91d0: 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53  Used only when S
91e0: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73  QLITE_NO_SYNC is
91f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20   not defined..  
9200: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23   */.  BOOL rc;.#
9210: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
9220: 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
9230: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
9240: 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20  _SYNC) || \.    
9250: 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  (defined(SQLITE_
9260: 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
9270: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a  (SQLITE_DEBUG)).
9280: 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77    /*.  ** Used w
9290: 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
92a0: 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
92b0: 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73  d and by the ass
92c0: 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a  ert() and/or.  *
92d0: 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72  * OSTRACE() macr
92e0: 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46  os..   */.  winF
92f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
9300: 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65  nFile*)id;.#else
9310: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9320: 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a  TER(id);.#endif.
9330: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
9340: 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   );.  /* Check t
9350: 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
9360: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
9370: 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
9380: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
9390: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
93a0: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
93b0: 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
93c0: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
93d0: 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53  _FULL.  );..  OS
93e0: 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64 20  TRACE(("SYNC %d 
93f0: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
9400: 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
9410: 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 55  ktype));..  /* U
9420: 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
9430: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
9440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
9450: 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
9460: 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
9470: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
9480: 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
9490: 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
94a0: 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
94b0: 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
94c0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
94d0: 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 66  FULL );..#ifndef
94e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55   SQLITE_TEST.  U
94f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9500: 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20  flags);.#else.  
9510: 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29  if( (flags&0x0F)
9520: 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
9530: 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
9540: 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
9550: 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ++;.  }.  sqlite
9560: 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
9570: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
9580: 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
9590: 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
95a0: 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
95b0: 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
95c0: 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64   no-op.  */.#ifd
95d0: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
95e0: 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  C.  return SQLIT
95f0: 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63  E_OK;.#else.  rc
9600: 20 3d 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66   = FlushFileBuff
9610: 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
9620: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
9630: 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
9640: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
9650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
9670: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
9680: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
9690: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
96a0: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
96b0: 45 52 52 5f 46 53 59 4e 43 2c 20 22 77 69 6e 53  ERR_FSYNC, "winS
96c0: 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
96d0: 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  th);.  }.#endif.
96e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
96f0: 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
9700: 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
9710: 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
9720: 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
9730: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9740: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
9750: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52   *pSize){.  DWOR
9760: 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 44  D upperBits;.  D
9770: 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a  WORD lowerBits;.
9780: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
9790: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
97a0: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 3b 0a  .  DWORD error;.
97b0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
97c0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
97d0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
97e0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
97f0: 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20  ;.  lowerBits = 
9800: 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
9810: 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
9820: 29 3b 0a 20 20 69 66 28 20 20 20 28 6c 6f 77 65  );.  if(   (lowe
9830: 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44  rBits == INVALID
9840: 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20  _FILE_SIZE).    
9850: 20 26 26 20 28 28 65 72 72 6f 72 20 3d 20 47 65   && ((error = Ge
9860: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20 21 3d  tLastError()) !=
9870: 20 4e 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20 7b   NO_ERROR) ).  {
9880: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
9890: 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 20  Errno = error;. 
98a0: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
98b0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
98c0: 52 52 5f 46 53 54 41 54 2c 20 22 77 69 6e 46 69  RR_FSTAT, "winFi
98d0: 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
98e0: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a 70  zPath);.  }.  *p
98f0: 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65  Size = (((sqlite
9900: 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74  3_int64)upperBit
9910: 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42  s)<<32) + lowerB
9920: 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  its;.  return SQ
9930: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9940: 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  * LOCKFILE_FAIL_
9950: 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75  IMMEDIATELY is u
9960: 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65  ndefined on some
9970: 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
9980: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43  ..*/.#ifndef LOC
9990: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
99a0: 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20  IATELY.# define 
99b0: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
99c0: 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64  MEDIATELY 1.#end
99d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  if../*.** Acquir
99e0: 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
99f0: 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
9a00: 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
9a10: 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
9a20: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
9a30: 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
9a40: 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  95 or WinNT..*/.
9a50: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65  static int getRe
9a60: 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
9a70: 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
9a80: 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  s;.  if( isNT() 
9a90: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
9aa0: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70  D ovlp;.    ovlp
9ab0: 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44  .Offset = SHARED
9ac0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70  _FIRST;.    ovlp
9ad0: 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b  .OffsetHigh = 0;
9ae0: 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74  .    ovlp.hEvent
9af0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20   = 0;.    res = 
9b00: 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65  LockFileEx(pFile
9b10: 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  ->h, LOCKFILE_FA
9b20: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a  IL_IMMEDIATELY,.
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 20 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53       0, SHARED_S
9b50: 49 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a  IZE, 0, &ovlp);.
9b60: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
9b70: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
9b80: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
9b90: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
9ba0: 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51  uted. .*/.#if SQ
9bb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
9bc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
9bd0: 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
9be0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
9bf0: 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
9c00: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
9c10: 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
9c20: 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
9c30: 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
9c40: 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
9c50: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
9c60: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
9c70: 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
9c80: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
9c90: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  0);.#endif.  }. 
9ca0: 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
9cb0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
9cc0: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
9cd0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e  rror();.    /* N
9ce0: 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20  o need to log a 
9cf0: 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20  failure to lock 
9d00: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
9d10: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  res;.}../*.** Un
9d20: 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f  do a readlock.*/
9d30: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f  .static int unlo
9d40: 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  ckReadLock(winFi
9d50: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
9d60: 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e  t res;.  if( isN
9d70: 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  T() ){.    res =
9d80: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
9d90: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
9da0: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
9db0: 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54 28  ZE, 0);./* isNT(
9dc0: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
9dd0: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
9de0: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
9df0: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
9e00: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
9e10: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
9e20: 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f  {.    res = Unlo
9e30: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
9e40: 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
9e50: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
9e60: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
9e70: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
9e80: 28 20 72 65 73 3d 3d 30 20 26 26 20 47 65 74 4c  ( res==0 && GetL
9e90: 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f  astError()!=ERRO
9ea0: 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 20 29 7b 0a  R_NOT_LOCKED ){.
9eb0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
9ec0: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
9ed0: 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
9ee0: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
9ef0: 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 75 6e 6c  ERR_UNLOCK, "unl
9f00: 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46  ockReadLock", pF
9f10: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
9f20: 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
9f30: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
9f40: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
9f50: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
9f60: 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
9f70: 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
9f80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
9f90: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
9fa0: 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
9fb0: 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
9fc0: 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
9fd0: 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
9fe0: 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
9ff0: 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
a000: 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
a010: 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
a020: 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
a030: 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
a040: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
a050: 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
a060: 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
a070: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
a080: 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
a090: 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
a0a0: 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
a0b0: 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
a0c0: 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
a0d0: 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
a0e0: 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
a0f0: 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
a100: 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
a110: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
a120: 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
a130: 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
a140: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
a150: 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
a160: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
a170: 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
a180: 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
a190: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
a1a0: 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
a1b0: 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
a1c0: 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
a1d0: 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
a1e0: 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
a1f0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
a200: 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
a210: 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b  .  The winUnlock
a220: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72  () routine.** er
a230: 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ases all locks a
a240: 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72  t once and retur
a250: 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c  ns us immediatel
a260: 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  y to locking lev
a270: 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  el 0..** It is n
a280: 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  ot possible to l
a290: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
a2a0: 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20   level one step 
a2b0: 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a  at a time.  You.
a2c0: 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69  ** must go strai
a2d0: 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ght to locking l
a2e0: 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  evel 0..*/.stati
a2f0: 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71  c int winLock(sq
a300: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
a310: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
a320: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a330: 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72  _OK;    /* Retur
a340: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72  n code from subr
a350: 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
a360: 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
a370: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
a380: 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b 20   a windows lock 
a390: 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  call */.  int ne
a3a0: 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20  wLocktype;      
a3b0: 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c   /* Set pFile->l
a3c0: 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20  ocktype to this 
a3d0: 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69  value before exi
a3e0: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f  ting */.  int go
a3f0: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
a400: 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61  ;/* True if we a
a410: 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e  cquired a PENDIN
a420: 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65  G lock this time
a430: 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
a440: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
a450: 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72  )id;.  DWORD err
a460: 6f 72 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  or = NO_ERROR;..
a470: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
a480: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
a490: 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25 64  OCK %d %d was %d
a4a0: 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  (%d)\n",.       
a4b0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
a4c0: 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c  cktype, pFile->l
a4d0: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
a4e0: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29  sharedLockByte))
a4f0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
a500: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
a510: 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
a520: 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
a530: 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
a540: 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
a550: 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
a560: 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
a570: 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
a580: 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
a590: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
a5a0: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
a5b0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
a5c0: 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
a5d0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
a5e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
a5f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
a600: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
a610: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
a620: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
a630: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e  ile->locktype!=N
a640: 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79  O_LOCK || lockty
a650: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
a660: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
a670: 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c  ktype!=PENDING_L
a680: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
a690: 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52   locktype!=RESER
a6a0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
a6b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
a6c0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
a6d0: 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49  * Lock the PENDI
a6e0: 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20  NG_LOCK byte if 
a6f0: 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69  we need to acqui
a700: 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  re a PENDING loc
a710: 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52  k or.  ** a SHAR
a720: 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20  ED lock.  If we 
a730: 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  are acquiring a 
a740: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
a750: 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a   acquisition of.
a760: 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47    ** the PENDING
a770: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65  _LOCK byte is te
a780: 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  mporary..  */.  
a790: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46  newLocktype = pF
a7a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
a7b0: 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c   if(   (pFile->l
a7c0: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
a7d0: 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c  ).     || (   (l
a7e0: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
a7f0: 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  VE_LOCK).       
a800: 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    && (pFile->loc
a810: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
a820: 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20  LOCK)).  ){.    
a830: 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20  int cnt = 3;.   
a840: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
a850: 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69  && (res = LockFi
a860: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
a870: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
a880: 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
a890: 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20   /* Try 3 times 
a8a0: 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69  to get the pendi
a8b0: 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70 65  ng lock.  The pe
a8c0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68 74  nding lock might
a8d0: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 6c   be.      ** hel
a8e0: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65 61  d by another rea
a8f0: 64 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f 20  der process who 
a900: 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74 20  will release it 
a910: 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20 20  momentarily..   
a920: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52     */.      OSTR
a930: 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20  ACE(("could not 
a940: 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  get a PENDING lo
a950: 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63  ck. cnt=%d\n", c
a960: 6e 74 29 29 3b 0a 20 20 20 20 20 20 53 6c 65 65  nt));.      Slee
a970: 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
a980: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
a990: 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72   res;.    if( !r
a9a0: 65 73 20 29 7b 0a 20 20 20 20 20 20 65 72 72 6f  es ){.      erro
a9b0: 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  r = GetLastError
a9c0: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
a9d0: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68   /* Acquire a sh
a9e0: 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  ared lock.  */. 
a9f0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
aa00: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  HARED_LOCK && re
aa10: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
aa20: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
aa30: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ==NO_LOCK );.   
aa40: 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f   res = getReadLo
aa50: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  ck(pFile);.    i
aa60: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
aa70: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48  newLocktype = SH
aa80: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
aa90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f  else{.      erro
aaa0: 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  r = GetLastError
aab0: 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
aac0: 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
aad0: 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
aae0: 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
aaf0: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
ab00: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
ab10: 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
ab20: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
ab30: 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  K );.    res = L
ab40: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
ab50: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
ab60: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
ab70: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
ab80: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45  newLocktype = RE
ab90: 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SERVED_LOCK;.   
aba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72   }else{.      er
abb0: 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
abc0: 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
abd0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
abe0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
abf0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
ac00: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
ac10: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
ac20: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
ac30: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
ac40: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
ac50: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
ac60: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
ac70: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
ac80: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
ac90: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
aca0: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
acb0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
acc0: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
acd0: 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63  .    res = unloc
ace0: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
acf0: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
ad00: 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c  unreadlock = %d\
ad10: 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72  n", res));.    r
ad20: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
ad30: 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
ad40: 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
ad50: 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
ad60: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
ad70: 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43  ewLocktype = EXC
ad80: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
ad90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72   }else{.      er
ada0: 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
adb0: 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
adc0: 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64 65  ACE(("error-code
add0: 20 3d 20 25 64 5c 6e 22 2c 20 65 72 72 6f 72 29   = %d\n", error)
ade0: 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61 64  );.      getRead
adf0: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
ae00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
ae10: 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61  we are holding a
ae20: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
ae30: 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72  at ought to be r
ae40: 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20  eleased, then.  
ae50: 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f  ** release it no
ae60: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f  w..  */.  if( go
ae70: 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20  tPendingLock && 
ae80: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
ae90: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
aea0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
aeb0: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
aec0: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 1, 0);.  }.. 
aed0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73   /* Update the s
aee0: 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  tate of the lock
aef0: 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65   has held in the
af00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
af10: 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72   then.  ** retur
af20: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
af30: 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20  e result code.. 
af40: 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b   */.  if( res ){
af50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
af60: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
af70: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
af80: 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69 6e   FAILED %d tryin
af90: 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f 74  g for %d but got
afa0: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
afb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
afc0: 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
afd0: 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  pe));.    pFile-
afe0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
aff0: 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  or;.    rc = SQL
b000: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
b010: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
b020: 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
b030: 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
b040: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
b050: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
b060: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
b070: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
b080: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
b090: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
b0a0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
b0b0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
b0c0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74  ock is held, ret
b0d0: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c  urn.** non-zero,
b0e0: 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e   otherwise zero.
b0f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b100: 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  inCheckReservedL
b110: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
b120: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
b130: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ut){.  int rc;. 
b140: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
b150: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
b160: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
b170: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
b180: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b190: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
b1a0: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
b1b0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
b1c0: 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
b1d0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  D_LOCK ){.    rc
b1e0: 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43   = 1;.    OSTRAC
b1f0: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
b200: 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e   %d %d (local)\n
b210: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
b220: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b230: 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  rc = LockFile(pF
b240: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
b250: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
b260: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b270: 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28       UnlockFile(
b280: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
b290: 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
b2a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
b2b0: 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41  = !rc;.    OSTRA
b2c0: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
b2d0: 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29  K %d %d (remote)
b2e0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
b2f0: 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  c));.  }.  *pRes
b300: 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75  Out = rc;.  retu
b310: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b320: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
b330: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
b340: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
b350: 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
b360: 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
b370: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
b380: 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
b390: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
b3a0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
b3b0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
b3c0: 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
b3d0: 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
b3e0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
b3f0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
b400: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
b410: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
b420: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
b430: 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
b440: 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
b450: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b460: 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
b470: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
b480: 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
b490: 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
b4a0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
b4b0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
b4c0: 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
b4d0: 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
b4e0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
b4f0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
b500: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
b510: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
b520: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
b530: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b540: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
b550: 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
b560: 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
b570: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
b580: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
b590: 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25  d to %d was %d(%
b5a0: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
b5b0: 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20   locktype,.     
b5c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b       pFile->lock
b5d0: 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
b5e0: 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20  redLockByte));. 
b5f0: 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c   type = pFile->l
b600: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74  ocktype;.  if( t
b610: 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype>=EXCLUSIVE_L
b620: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
b630: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
b640: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
b650: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
b660: 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79  ;.    if( lockty
b670: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
b680: 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28  && !getReadLock(
b690: 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
b6a0: 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
b6b0: 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
b6c0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
b6d0: 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
b6e0: 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
b6f0: 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
b700: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
b710: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
b720: 52 5f 55 4e 4c 4f 43 4b 2c 20 22 77 69 6e 55 6e  R_UNLOCK, "winUn
b730: 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lock", pFile->zP
b740: 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
b750: 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
b760: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
b770: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
b780: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
b790: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
b7a0: 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
b7b0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
b7c0: 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
b7d0: 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61  ){.    unlockRea
b7e0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
b7f0: 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
b800: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
b810: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
b820: 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
b830: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
b840: 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
b850: 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  type = (u8)lockt
b860: 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ype;.  return rc
b870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72  ;.}../*.** Contr
b880: 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20  ol and query of 
b890: 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  the open file ha
b8a0: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
b8b0: 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  int winFileContr
b8c0: 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
b8d0: 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
b8e0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46  d *pArg){.  winF
b8f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
b900: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  nFile*)id;.  swi
b910: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
b920: 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
b930: 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
b940: 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
b950: 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
b960: 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
b970: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
b980: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
b990: 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
b9a0: 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
b9b0: 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c   = (int)pFile->l
b9c0: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
b9d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b9e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b9f0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
ba00: 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
ba10: 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
ba20: 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
ba30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
ba40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
ba50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
ba60: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
ba70: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  {.      if( pFil
ba80: 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
ba90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
baa0: 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20  int64 oldSz;.   
bab0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
bac0: 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f  nFileSize(id, &o
bad0: 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ldSz);.        i
bae0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
baf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
bb00: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53  lite3_int64 newS
bb10: 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e  z = *(sqlite3_in
bb20: 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  t64*)pArg;.     
bb30: 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f       if( newSz>o
bb40: 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ldSz ){.        
bb50: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
bb60: 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
bb70: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
bb80: 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e  inTruncate(id, n
bb90: 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ewSz);.         
bba0: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
bbb0: 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
bbc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bbd0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
bbe0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
bbf0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bc00: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
bc10: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
bc20: 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
bc30: 0a 20 20 20 20 20 20 69 6e 74 20 62 50 65 72 73  .      int bPers
bc40: 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72  ist = *(int*)pAr
bc50: 67 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50 65  g;.      if( bPe
bc60: 72 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20 20  rsist<0 ){.     
bc70: 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
bc80: 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74   pFile->bPersist
bc90: 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Wal;.      }else
bca0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
bcb0: 3e 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20 62  >bPersistWal = b
bcc0: 50 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20 20  Persist!=0;.    
bcd0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
bce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
bcf0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
bd00: 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49  E_FCNTL_SYNC_OMI
bd10: 54 54 45 44 3a 20 7b 0a 20 20 20 20 20 20 72 65  TTED: {.      re
bd20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bd30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
bd40: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
bd50: 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20  2_AV_RETRY: {.  
bd60: 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e      int *a = (in
bd70: 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  t*)pArg;.      i
bd80: 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20  f( a[0]>0 ){.   
bd90: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
bda0: 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
bdb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bdc0: 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f    a[0] = win32Io
bdd0: 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20  errRetry;.      
bde0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d  }.      if( a[1]
bdf0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  >0 ){.        wi
be00: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
be10: 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  ay = a[1];.     
be20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
be30: 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72  a[1] = win32Ioer
be40: 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20  rRetryDelay;.   
be50: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
be60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
be70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
be80: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
be90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bea0: 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
beb0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
bec0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
bed0: 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
bee0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
bef0: 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
bf00: 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
bf10: 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
bf20: 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
bf30: 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
bf40: 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
bf50: 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
bf60: 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
bf70: 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
bf80: 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
bf90: 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
bfa0: 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
bfb0: 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
bfc0: 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
bfd0: 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
bfe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
bff0: 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
c000: 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
c010: 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
c020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c030: 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  inSectorSize(sql
c040: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
c050: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
c060: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  );.  return (int
c070: 29 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  )(((winFile*)id)
c080: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 7d  ->sectorSize);.}
c090: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
c0a0: 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
c0b0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c0c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
c0d0: 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
c0e0: 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
c0f0: 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 55  3_file *id){.  U
c100: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
c110: 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  id);.  return SQ
c120: 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
c130: 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
c140: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
c150: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
c160: 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c   .** Windows wil
c170: 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
c180: 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
c190: 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
c1a0: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
c1b0: 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
c1c0: 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
c1d0: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
c1e0: 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
c1f0: 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
c200: 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
c210: 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59  rity size..*/.SY
c220: 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73  STEM_INFO winSys
c230: 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  Info;../*.** Hel
c240: 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
c250: 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
c260: 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
c270: 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
c280: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
c290: 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
c2a0: 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
c2b0: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
c2c0: 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
c2d0: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
c2e0: 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
c2f0: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
c300: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
c310: 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
c320: 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
c330: 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
c340: 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
c350: 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
c360: 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
c370: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
c380: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
c390: 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
c3a0: 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
c3b0: 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
c3c0: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
c3d0: 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
c3e0: 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e  ld() );.**   win
c3f0: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a  ShmLeaveMutex().
c400: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
c410: 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
c420: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
c430: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
c440: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
c450: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
c460: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
c470: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
c480: 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
c490: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
c4a0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
c4b0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
c4c0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
c4d0: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
c4e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
c4f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
c500: 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
c510: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
c520: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
c530: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
c540: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
c550: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
c560: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
c570: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
c580: 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
c590: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
c5a0: 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
c5b0: 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
c5c0: 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
c5d0: 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
c5e0: 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
c5f0: 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
c600: 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
c610: 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
c620: 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
c630: 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
c640: 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
c650: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
c660: 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
c670: 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
c680: 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
c690: 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
c6a0: 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
c6b0: 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
c6c0: 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
c6d0: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
c6e0: 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
c6f0: 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
c700: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
c710: 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
c720: 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
c730: 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
c740: 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
c750: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
c760: 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
c770: 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
c780: 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
c790: 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
c7a0: 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
c7b0: 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
c7c0: 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
c7d0: 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
c7e0: 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
c7f0: 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
c800: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
c810: 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
c820: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
c830: 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
c840: 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
c850: 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
c860: 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
c870: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
c880: 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
c890: 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
c8a0: 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
c8b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
c8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
c8d0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
c8e0: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
c8f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
c900: 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
c910: 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
c920: 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
c930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c940: 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
c950: 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
c960: 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c980: 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
c990: 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
c9a0: 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
c9b0: 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c9d0: 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
c9e0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
c9f0: 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
ca00: 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
ca10: 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
ca20: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
ca30: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
ca40: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
ca50: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
ca60: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ca80: 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
ca90: 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
caa0: 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
cab0: 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
cac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
cad0: 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
cae0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
caf0: 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
cb00: 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
cb10: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
cb20: 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
cb30: 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
cb40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
cb50: 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
cb60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
cb70: 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
cb80: 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
cb90: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
cba0: 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
cbb0: 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
cbc0: 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
cbd0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
cbe0: 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
cbf0: 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
cc00: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
cc10: 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
cc20: 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
cc30: 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
cc40: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
cc50: 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
cc60: 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
cc70: 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
cc80: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
cc90: 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
cca0: 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
ccb0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
ccc0: 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
ccd0: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
cce0: 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
ccf0: 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
cd00: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
cd10: 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
cd20: 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
cd30: 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
cd40: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
cd50: 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
cd60: 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
cd70: 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
cd80: 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
cd90: 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
cda0: 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
cdb0: 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
cdc0: 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
cdd0: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
cde0: 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
cdf0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
ce00: 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
ce10: 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
ce20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
ce30: 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
ce40: 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
ce50: 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
ce60: 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
ce70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
ce80: 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
ce90: 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
cea0: 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
ceb0: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
cec0: 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
ced0: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
cee0: 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cf00: 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
cf10: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
cf20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
cf30: 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
cf60: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
cf70: 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
cf80: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
cf90: 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
cfa0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
cfb0: 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
cfc0: 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
cfd0: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
cfe0: 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
cff0: 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
d000: 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
d010: 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
d020: 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
d030: 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
d040: 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
d050: 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
d060: 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
d070: 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
d080: 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
d090: 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
d0a0: 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
d0b0: 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
d0c0: 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
d0d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
d0e0: 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
d0f0: 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
d100: 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
d110: 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
d120: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
d130: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
d140: 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
d150: 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
d160: 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
d170: 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
d180: 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
d190: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
d1a0: 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
d1b0: 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
d1c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1e0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
d1f0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
d200: 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c 41  k */.){.  OVERLA
d210: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57 4f  PPED ovlp;.  DWO
d220: 52 44 20 64 77 46 6c 61 67 73 3b 0a 20 20 69 6e  RD dwFlags;.  in
d230: 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
d240: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
d250: 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c  de form Lock/Unl
d260: 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a  ockFileEx() */..
d270: 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
d280: 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  he winShmNode ob
d290: 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
d2a0: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
d2b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
d2c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d2d0: 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
d2e0: 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
d2f0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   );..  /* Initia
d300: 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
d310: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
d320: 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
d330: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
d340: 54 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f 63 6b  TELY;.  if( lock
d350: 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c  Type == _SHM_WRL
d360: 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20  CK ) dwFlags |= 
d370: 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
d380: 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73  VE_LOCK;..  mems
d390: 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
d3a0: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
d3b0: 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20  ;.  ovlp.Offset 
d3c0: 3d 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20 52 65  = ofst;..  /* Re
d3d0: 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68  lease/Acquire th
d3e0: 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
d3f0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ock */.  if( loc
d400: 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
d410: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 55 6e  K ){.    rc = Un
d420: 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65  lockFileEx(pFile
d430: 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e 42  ->hFile.h, 0, nB
d440: 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a  yte, 0, &ovlp);.
d450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
d460: 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69  = LockFileEx(pFi
d470: 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46  le->hFile.h, dwF
d480: 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74 65 2c 20  lags, 0, nByte, 
d490: 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 0a 20  0, &ovlp);.  }. 
d4a0: 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29   .  if( rc!= 0 )
d4b0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
d4c0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
d4d0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d4e0: 72 6e 6f 20 3d 20 20 47 65 74 4c 61 73 74 45 72  rno =  GetLastEr
d4f0: 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  ror();.    rc = 
d500: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
d510: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
d520: 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20  M-LOCK %d %s %s 
d530: 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20  0x%08lx\n", .   
d540: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
d550: 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
d560: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
d570: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
d580: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c  d",.           l
d590: 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
d5a0: 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c  LCK ? "UnlockFil
d5b0: 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65  eEx" : "LockFile
d5c0: 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Ex",.           
d5d0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d5e0: 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ));..  return rc
d5f0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
d600: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
d610: 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  S methods */.sta
d620: 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28  tic int winOpen(
d630: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e  sqlite3_vfs*,con
d640: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33  st char*,sqlite3
d650: 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29  _file*,int,int*)
d660: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
d670: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
d680: 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  fs *,const char*
d690: 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75  ,int);../*.** Pu
d6a0: 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  rge the winShmNo
d6b0: 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
d6c0: 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
d6d0: 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
d6e0: 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  =0..**.** This i
d6f0: 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72  s not a VFS shar
d700: 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
d710: 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69 74  ; it is a utilit
d720: 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  y function calle
d730: 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72  d.** by VFS shar
d740: 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64  ed-memory method
d750: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
d760: 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71  d winShmPurge(sq
d770: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
d780: 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29   int deleteFlag)
d790: 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
d7a0: 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  *pp;.  winShmNod
d7b0: 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63  e *p;.  BOOL bRc
d7c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
d7d0: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
d7e0: 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
d7f0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
d800: 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
d810: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
d820: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
d830: 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
d840: 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
d850: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
d860: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
d870: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
d880: 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
d890: 20 20 20 62 52 63 20 3d 20 55 6e 6d 61 70 56 69     bRc = UnmapVi
d8a0: 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67  ewOfFile(p->aReg
d8b0: 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20  ion[i].pMap);.  
d8c0: 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
d8d0: 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
d8e0: 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64   unmap region=%d
d8f0: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
d900: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 47 65           (int)Ge
d910: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
d920: 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  d(), i,.        
d930: 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22           bRc ? "
d940: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
d950: 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  ;.        bRc = 
d960: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
d970: 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
d980: 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
d990: 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
d9a0: 2d 25 64 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e  -%d close region
d9b0: 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
d9d0: 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  )GetCurrentProce
d9e0: 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20  ssId(), i,.     
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20              bRc 
da00: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
da10: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
da20: 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
da30: 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  h != INVALID_HAN
da40: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
da50: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
da60: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
da70: 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28         winClose(
da80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
da90: 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20  &p->hFile);.    
daa0: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
dab0: 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
dac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dad0: 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20  deleteFlag ){.  
dae0: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
daf0: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
db00: 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74          winDelet
db10: 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65  e(pVfs, p->zFile
db20: 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
db30: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
db40: 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
db50: 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
db60: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
db70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
db80: 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  aRegion);.      
db90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
dba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dbb0: 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
dbc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
dbd0: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
dbe0: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
dbf0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dc00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
dc10: 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
dc20: 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
dc30: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
dc40: 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
dc50: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
dc60: 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
dc70: 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
dc80: 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
dc90: 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
dca0: 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
dcb0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
dcc0: 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
dcd0: 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
dce0: 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
dcf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dd00: 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
dd10: 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
dd20: 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
dd30: 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
dd40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dd50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
dd60: 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
dd70: 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
dd80: 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
dd90: 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
dda0: 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
ddb0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
dde0: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75  t code */.  stru
ddf0: 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
de00: 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
de10: 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
de20: 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  d winShmNode */.
de30: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
de60: 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
de70: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
de80: 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20  Fd->pShm==0 );  
de90: 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75    /* Not previou
dea0: 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20  sly opened */.. 
deb0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
dec0: 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ce for the new s
ded0: 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63  qlite3_shm objec
dee0: 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61  t.  Also specula
def0: 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  tively.  ** allo
df00: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
df10: 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20   new winShmNode 
df20: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  and filename..  
df30: 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
df40: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
df50: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
df60: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
df70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65  E_NOMEM;.  memse
df80: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
df90: 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  p));.  nName = s
dfa0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
dfb0: 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
dfc0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pNew = sqlite3_m
dfd0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
dfe0: 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65  ShmNode) + nName
dff0: 20 2b 20 31 35 20 29 3b 0a 20 20 69 66 28 20 70   + 15 );.  if( p
e000: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
e010: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
e020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e030: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
e040: 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
e050: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
e060: 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
e070: 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
e080: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
e090: 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20  rintf(nName+15, 
e0a0: 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  pNew->zFilename,
e0b0: 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
e0c0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69  ->zPath);.  sqli
e0d0: 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
e0e0: 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65  DbFd->zPath, pNe
e0f0: 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a  w->zFilename); .
e100: 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
e110: 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
e120: 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
e130: 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
e140: 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
e150: 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
e160: 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
e170: 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
e180: 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
e190: 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
e1a0: 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
e1b0: 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
e1c0: 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
e1d0: 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
e1e0: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
e1f0: 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
e200: 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
e210: 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
e220: 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
e230: 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
e240: 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
e250: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
e260: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e270: 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
e280: 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
e290: 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
e2a0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
e2b0: 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
e2c0: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
e2d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
e2e0: 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
e2f0: 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
e300: 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
e310: 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
e320: 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
e330: 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
e340: 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
e350: 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
e360: 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
e370: 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
e380: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
e390: 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
e3a0: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
e3b0: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
e3c0: 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
e3d0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
e3e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e3f0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
e400: 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
e410: 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
e420: 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
e430: 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
e440: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
e450: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
e460: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
e470: 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
e480: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
e490: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
e4a0: 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
e4b0: 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
e4c0: 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
e4f0: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
e500: 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
e510: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a  _OPEN_CREATE, /*
e520: 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   Mode flags */. 
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  0);.    if( SQLI
e550: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
e560: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
e570: 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
e580: 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
e590: 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
e5a0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
e5b0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
e5c0: 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
e5d0: 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
e5e0: 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
e5f0: 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
e600: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
e610: 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ngth. .    */.  
e620: 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74    if( winShmSyst
e630: 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
e640: 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e   _SHM_WRLCK, WIN
e650: 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
e660: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e670: 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
e680: 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
e690: 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
e6a0: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
e6b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e6c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e6d0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
e6e0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
e6f0: 2c 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20  , "winOpenShm", 
e700: 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
e710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e720: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e730: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
e740: 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
e750: 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
e760: 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
e770: 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
e780: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
e790: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
e7a0: 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
e7b0: 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
e7c0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
e7d0: 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
e7e0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
e7f0: 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
e800: 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
e810: 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
e820: 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
e830: 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
e840: 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
e850: 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
e860: 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
e870: 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
e880: 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
e890: 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
e8a0: 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
e8b0: 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
e8c0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
e8d0: 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
e8e0: 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
e8f0: 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
e900: 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
e910: 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
e920: 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
e930: 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
e940: 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
e950: 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
e960: 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
e970: 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
e980: 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
e990: 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
e9a0: 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
e9b0: 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
e9c0: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
e9d0: 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
e9e0: 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
e9f0: 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
ea00: 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
ea10: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
ea20: 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
ea30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
ea40: 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
ea50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
ea60: 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
ea70: 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
ea80: 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
ea90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
eaa0: 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
eab0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
eac0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
ead0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
eae0: 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
eaf0: 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
eb00: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
eb10: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
eb20: 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
eb30: 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
eb40: 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
eb50: 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
eb60: 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
eb70: 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
eb80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
eb90: 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
eba0: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
ebb0: 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
ebc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ebd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ebe0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
ebf0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
ec00: 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
ec10: 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
ec20: 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
ec30: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
ec40: 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
ec50: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
ec60: 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
ec70: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
ec80: 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
ec90: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
eca0: 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
ecb0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
ecc0: 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
ecd0: 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
ece0: 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
ecf0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
ed00: 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
ed10: 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
ed20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ed30: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
ed40: 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
ed50: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
ed60: 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
ed70: 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
ed80: 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
ed90: 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
eda0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
edb0: 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
edc0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
edd0: 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
ede0: 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
edf0: 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
ee00: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
ee10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
ee20: 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
ee30: 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
ee40: 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
ee50: 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
ee60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
ee70: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
ee80: 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
ee90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
eea0: 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
eeb0: 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
eec0: 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
eed0: 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
eee0: 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
eef0: 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
ef00: 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
ef10: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
ef20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
ef30: 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
ef40: 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
ef50: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
ef60: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
ef70: 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
ef80: 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
ef90: 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
efa0: 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
efb0: 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
efc0: 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
efd0: 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
efe0: 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
eff0: 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
f000: 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
f010: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
f020: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
f030: 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
f040: 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
f050: 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
f060: 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
f070: 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
f080: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f090: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
f0a0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
f0b0: 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
f0c0: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
f0d0: 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
f0e0: 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
f0f0: 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
f100: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
f110: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
f120: 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
f130: 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
f140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
f150: 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
f160: 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
f170: 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
f1a0: 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
f1b0: 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
f1c0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
f1d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
f1e0: 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
f1f0: 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
f200: 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
f210: 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
f220: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
f230: 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
f240: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
f250: 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
f260: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
f270: 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
f280: 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
f290: 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
f2a0: 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f2c0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
f2d0: 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
f2e0: 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
f2f0: 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
f300: 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
f310: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
f340: 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
f370: 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
f380: 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
f390: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
f3a0: 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
f3b0: 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
f3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
f3d0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
f3e0: 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
f3f0: 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
f400: 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
f410: 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
f420: 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
f430: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
f440: 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
f450: 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
f460: 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
f470: 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
f480: 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
f490: 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
f4a0: 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
f4b0: 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
f4c0: 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
f4d0: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
f4e0: 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
f4f0: 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
f500: 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
f510: 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
f520: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
f530: 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
f540: 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
f550: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
f560: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
f570: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
f580: 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
f590: 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
f5a0: 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
f5b0: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
f5c0: 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
f5d0: 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
f5e0: 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
f5f0: 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
f600: 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
f610: 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
f620: 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
f630: 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
f640: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f650: 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
f660: 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
f670: 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
f680: 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
f690: 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
f6a0: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
f6b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
f6c0: 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
f6d0: 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
f6e0: 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
f6f0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
f700: 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
f710: 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
f720: 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  , _SHM_UNLCK, of
f730: 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
f740: 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
f750: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f760: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
f770: 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
f780: 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
f790: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f7a0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
f7b0: 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
f7c0: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
f7d0: 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
f7e0: 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
f7f0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
f800: 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
f810: 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
f820: 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
f830: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
f840: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
f850: 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
f860: 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
f870: 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
f880: 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
f890: 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
f8a0: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
f8b0: 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
f8c0: 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
f8d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
f8e0: 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
f8f0: 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
f900: 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
f910: 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
f920: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
f930: 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
f940: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
f950: 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
f960: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
f970: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
f980: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
f990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
f9a0: 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
f9b0: 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
f9c0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
f9d0: 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
f9e0: 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
f9f0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
fa00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
fa10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
fa20: 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
fa30: 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
fa40: 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
fa50: 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
fa60: 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
fa70: 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
fa80: 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
fa90: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
faa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
fab0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
fac0: 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
fad0: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
fae0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
faf0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
fb00: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
fb10: 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
fb20: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
fb30: 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
fb40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
fb50: 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
fb60: 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
fb70: 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
fb80: 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
fb90: 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
fba0: 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
fbb0: 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
fbc0: 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
fbd0: 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
fbe0: 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
fbf0: 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
fc00: 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
fc10: 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
fc20: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
fc30: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
fc40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
fc50: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
fc60: 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
fc70: 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
fc80: 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
fc90: 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
fca0: 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
fcb0: 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
fcc0: 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
fcd0: 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
fce0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
fcf0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
fd00: 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
fd10: 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
fd20: 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
fd30: 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
fd40: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
fd50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fd60: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
fd70: 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
fd80: 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
fd90: 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
fda0: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
fdb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
fdc0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
fdd0: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
fde0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
fdf0: 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
fe00: 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
fe10: 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20  %03x %s\n",.    
fe20: 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69         p->id, (i
fe30: 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  nt)GetCurrentPro
fe40: 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61  cessId(), p->sha
fe50: 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
fe60: 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Mask,.          
fe70: 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a   rc ? "failed" :
fe80: 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72   "ok"));.  retur
fe90: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
fea0: 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
feb0: 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
fec0: 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
fed0: 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
fee0: 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
fef0: 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
ff00: 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
ff10: 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
ff20: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
ff30: 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
ff40: 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
ff50: 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
ff60: 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
ff70: 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
ff80: 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
ff90: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
ffa0: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
ffb0: 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
ffc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
ffd0: 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61  );.  /* MemoryBa
ffe0: 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73  rrier(); // does
fff0: 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20   not work -- do 
10000 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74  not know why not
10010 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
10020 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53  rMutex();.  winS
10030 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
10040 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
10050 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
10060 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
10070 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
10080 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
10090 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
100a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
100b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
100c0 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
100d0 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
100e0 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
100f0 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
10100 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
10110 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
10120 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
10130 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
10140 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10150 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
10160 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
10170 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
10180 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
10190 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
101a0 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
101b0 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
101c0 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
101d0 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
101e0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
101f0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
10200 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
10210 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
10220 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
10230 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
10240 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
10250 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
10260 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73  urned. If .** is
10270 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
10280 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
10290 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
102a0 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
102b0 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
102c0 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
102d0 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
102e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
102f0 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
10300 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
10310 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
10320 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
10330 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
10340 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
10350 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
10360 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
10370 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
10380 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
10390 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
103a0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
103b0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
103c0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
103d0 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
103e0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
103f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10400 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
10410 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
10420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
10430 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
10440 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
10450 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
10480 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
10490 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
104a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
104b0 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
104c0 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104e0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
104f0 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
10500 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
10510 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10530 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
10540 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
10550 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
10560 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
10570 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
10580 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
10590 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e *pShmNode;.  i
105a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
105b0 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  K;..  if( !p ){.
105c0 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
105d0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
105e0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
105f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
10600 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20  urn rc;.    p = 
10610 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d  pDbFd->pShm;.  }
10620 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
10630 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
10640 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10650 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
10660 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
10670 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
10680 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
10690 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
106a0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
106b0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
106c0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
106d0 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
106e0 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
106f0 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
10700 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
10710 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
10720 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
10730 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
10740 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
10750 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
10760 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
10770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
10780 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
10790 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
107a0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
107b0 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
107c0 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
107d0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
107e0 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
107f0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
10800 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
10810 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
10820 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
10830 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
10840 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
10850 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
10860 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
10870 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
10880 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
10890 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
108a0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
108b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
108c0 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
108d0 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
108e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
108f0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
10900 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
10910 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77  OERR_SHMSIZE, "w
10920 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46  inShmMap1", pDbF
10930 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
10940 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
10950 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
10960 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20  ( sz<nByte ){.  
10970 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
10980 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
10990 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
109a0 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73  t. If isWrite is
109b0 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
109c0 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c   zero, exit earl
109d0 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
109e0 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
109f0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
10a00 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
10a10 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
10a20 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69  ly, if isWrite i
10a30 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20  s non-zero, use 
10a40 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
10a50 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
10a60 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
10a70 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
10a80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
10a90 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f   !isWrite ) goto
10aa0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
10ab0 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
10ac0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
10ad0 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
10ae0 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  hFile, nByte);. 
10af0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
10b00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10b10 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
10b20 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
10b30 53 48 4d 53 49 5a 45 2c 20 22 77 69 6e 53 68 6d  SHMSIZE, "winShm
10b40 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map2", pDbFd->zP
10b50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ath);.        go
10b60 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
10b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
10b80 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
10b90 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
10ba0 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
10bb0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
10bc0 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
10bd0 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20  apNew = (struct 
10be0 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69  ShmRegion *)sqli
10bf0 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
10c00 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
10c10 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
10c20 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77  +1)*sizeof(apNew
10c30 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  [0]).    );.    
10c40 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
10c50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10c60 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
10c70 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
10c80 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
10c90 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
10ca0 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77   = apNew;..    w
10cb0 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
10cc0 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
10cd0 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45   ){.      HANDLE
10ce0 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
10cf0 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61        /* file-ma
10d00 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a  pping handle */.
10d10 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70        void *pMap
10d20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10d30 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f    /* Mapped memo
10d40 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20  ry region */.   
10d50 20 20 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20    .      hMap = 
10d60 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
10d70 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  g(pShmNode->hFil
10d80 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
10d90 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
10da0 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
10db0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20  NULL.      );.  
10dc0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
10dd0 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65  M-MAP pid-%d cre
10de0 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62  ate region=%d nb
10df0 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  yte=%d %s\n",.  
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
10e10 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
10e20 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
10e30 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74  e->nRegion, nByt
10e40 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
10e50 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20    hMap ? "ok" : 
10e60 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
10e70 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20    if( hMap ){.  
10e80 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
10e90 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  t = pShmNode->nR
10ea0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
10eb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
10ec0 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
10ed0 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
10ee0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
10ef0 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 20 20 20  ularity;.       
10f00 20 70 4d 61 70 20 3d 20 4d 61 70 56 69 65 77 4f   pMap = MapViewO
10f10 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45  fFile(hMap, FILE
10f20 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
10f30 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
10f40 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73          0, iOffs
10f50 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
10f60 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
10f70 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
10f80 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 4f 53     );.        OS
10f90 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20  TRACE(("SHM-MAP 
10fa0 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69 6f  pid-%d map regio
10fb0 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20 73  n=%d offset=%d s
10fc0 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ize=%d %s\n",.  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10fe0 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
10ff0 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e  ocessId(), pShmN
11000 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f  ode->nRegion, iO
11010 66 66 73 65 74 2c 20 73 7a 52 65 67 69 6f 6e 2c  ffset, szRegion,
11020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11030 20 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20    pMap ? "ok" : 
11040 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
11050 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
11060 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Map ){.        p
11070 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
11080 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
11090 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r();.        rc 
110a0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
110b0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
110c0 50 2c 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c  P, "winShmMap3",
110d0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
110e0 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70          if( hMap
110f0 20 29 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   ) CloseHandle(h
11100 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
11110 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
11120 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
11130 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
11140 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
11150 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
11160 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
11170 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
11180 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
11190 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
111a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
111b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
111c0 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
111d0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
111e0 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
111f0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
11200 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
11210 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
11220 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
11230 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
11240 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
11250 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
11260 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
11270 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
11280 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
11290 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
112a0 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
112b0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
112c0 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  *pp = 0;.  }.  s
112d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
112e0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
112f0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
11300 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
11310 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20  ine winShmMap   
11320 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
11330 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
11340 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72  efine winShmBarr
11350 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77  ier 0.# define w
11360 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  inShmUnmap   0.#
11370 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
11380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11390 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20   */../*.** Here 
113a0 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
113b0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
113c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
113d0 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
113f0 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
11400 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11420 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11470 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
11480 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
11490 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
114a0 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
114b0 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
114c0 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
114d0 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
114e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
114f0 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
11500 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20  hod = {.  2,    
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
11530 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
11540 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
11550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
11560 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
11570 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
11580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
11590 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
115a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
115b0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
115c0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
115d0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
115e0 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
115f0 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
11600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11610 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
11620 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
11630 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
11640 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
11650 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b  ize */.  winLock
11660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11670 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
11680 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  k */.  winUnlock
11690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
116a0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
116b0 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52  k */.  winCheckR
116c0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
116d0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
116e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
116f0 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
11700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11710 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
11720 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
11730 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
11740 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
11750 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
11760 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11770 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
11780 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
11790 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
117a0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
117b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
117c0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
117d0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
117e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
117f0 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
11800 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
11810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
11820 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
11830 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20  inShmUnmap      
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11850 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d  * xShmUnmap */.}
11860 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
11870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
118b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
118c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
118d0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
118e0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
118f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11900 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
11910 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
11920 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
11930 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
11940 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
11950 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
11960 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
11970 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
11980 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
11990 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
119a0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
119b0 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
119c0 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
119d0 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
119e0 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
119f0 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
11a00 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
11a10 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
11a20 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
11a30 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55  c void *convertU
11a40 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
11a50 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
11a60 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  e){.  void *zCon
11a70 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
11a80 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
11a90 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
11aa0 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
11ab0 6e 61 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  name);./* isNT()
11ac0 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
11ad0 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
11ae0 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
11af0 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f  er executed. .*/
11b00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
11b10 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
11b20 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
11b30 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
11b40 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69  utf8_to_mbcs(zFi
11b50 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
11b60 20 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20    }.  /* caller 
11b70 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
11b80 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
11b90 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
11ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
11bb0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
11bc0 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
11bd0 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
11be0 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
11bf0 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78  hold at pVfs->mx
11c00 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74  Pathname charact
11c10 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
11c20 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69  nt getTempname(i
11c30 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
11c40 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
11c50 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
11c60 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
11c70 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
11c80 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
11c90 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
11ca0 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
11cb0 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a  ";.  size_t i, j
11cc0 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61  ;.  char zTempPa
11cd0 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a  th[MAX_PATH+1];.
11ce0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
11cf0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
11d00 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
11d10 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
11d20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
11d30 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
11d40 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
11d50 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
11d60 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
11d70 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
11d80 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
11d90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
11da0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11db0 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74   );..  if( sqlit
11dc0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
11dd0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
11de0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
11df0 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
11e00 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
11e10 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
11e20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e  .  }else if( isN
11e30 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
11e40 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48  *zMulti;.    WCH
11e50 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58  AR zWidePath[MAX
11e60 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54  _PATH];.    GetT
11e70 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54  empPathW(MAX_PAT
11e80 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29  H-30, zWidePath)
11e90 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75  ;.    zMulti = u
11ea0 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
11eb0 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dePath);.    if(
11ec0 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20   zMulti ){.     
11ed0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11ee0 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
11ef0 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
11f00 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66  zMulti);.      f
11f10 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
11f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
11f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11f40 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73 4e 54  M;.    }./* isNT
11f50 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
11f60 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
11f70 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
11f80 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
11f90 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43  ** Since the ASC
11fa0 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  II version of th
11fb0 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
11fc0 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
11fd0 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
11fe0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
11ff0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
12000 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
12010 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
12020 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
12030 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
12040 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a  Utf8;.    char z
12050 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54  MbcsPath[MAX_PAT
12060 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50  H];.    GetTempP
12070 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30  athA(MAX_PATH-30
12080 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20  , zMbcsPath);.  
12090 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65    zUtf8 = sqlite
120a0 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
120b0 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b  utf8(zMbcsPath);
120c0 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29  .    if( zUtf8 )
120d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
120e0 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
120f0 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
12100 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
12110 20 20 20 20 20 66 72 65 65 28 7a 55 74 66 38 29       free(zUtf8)
12120 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12130 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12140 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65  _NOMEM;.    }.#e
12150 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ndif.  }..  /* C
12160 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75  heck that the ou
12170 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c  tput buffer is l
12180 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
12190 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
121a0 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49  le .  ** name. I
121b0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74  f it is not, ret
121c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
121d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73 71  ..  */.  if( (sq
121e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
121f0 65 6d 70 50 61 74 68 29 20 2b 20 73 71 6c 69 74  empPath) + sqlit
12200 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54  e3Strlen30(SQLIT
12210 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
12220 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 6e 42 75  IX) + 17) >= nBu
12230 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
12240 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
12250 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  }..  for(i=sqlit
12260 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
12270 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54  Path); i>0 && zT
12280 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c  empPath[i-1]=='\
12290 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65  \'; i--){}.  zTe
122a0 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a  mpPath[i] = 0;..
122b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
122c0 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66  tf(nBuf-17, zBuf
122d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
122e0 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54       "%s\\"SQLIT
122f0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
12300 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a  IX, zTempPath);.
12310 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
12320 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
12330 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
12340 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
12350 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35  .  for(i=0; i<15
12360 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
12370 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
12380 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
12390 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
123a0 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
123b0 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
123c0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53  uf[j] = 0;..  OS
123d0 54 52 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c  TRACE(("TEMP FIL
123e0 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42  ENAME: %s\n", zB
123f0 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  uf));.  return S
12400 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
12410 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
12420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12430 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
12440 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
12450 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
12460 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12470 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
12480 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12490 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
124a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
124b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
124c0 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
124d0 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
124e0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12500 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
12510 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
12520 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12530 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
12540 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
12550 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
12560 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
12570 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
12580 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
12590 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
125a0 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
125b0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
125c0 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
125d0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
125e0 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
125f0 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
12600 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
12610 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
12620 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
12630 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
12640 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e  me in OS encodin
12650 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
12660 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a  r *zUtf8Name = z
12670 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  Name; /* Filenam
12680 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  e in UTF-8 encod
12690 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ing */.  int cnt
126a0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
126b0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
126c0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
126d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
126e0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
126f0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
12700 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
12710 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
12720 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
12730 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
12740 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
12750 54 48 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 42 75  TH+1];     /* Bu
12760 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72 65  ffer used to cre
12770 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d  ate temp filenam
12780 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d  e */..  int rc =
12790 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
127a0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
127b0 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
127c0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
127d0 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45  DEBUG) || SQLITE
127e0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
127f0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
12800 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
12810 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
12820 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  en */.#endif..  
12830 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
12840 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
12850 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
12860 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
12870 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
12880 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
12890 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
128a0 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
128b0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
128c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
128d0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
128e0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
128f0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
12900 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
12910 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  LY);.#endif.  in
12920 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
12930 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
12940 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
12950 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
12960 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
12970 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
12980 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
12990 54 79 70 65 3d 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 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
129c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
129d0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
129e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
129f0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
12a00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
12a10 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
12a20 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
12a30 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
12a40 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
12a50 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
12a60 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
12a70 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
12a80 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
12a90 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
12aa0 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
12ab0 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
12ac0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
12ad0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
12ae0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
12af0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
12b00 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
12b10 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
12b20 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
12b30 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
12b40 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
12b50 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
12b60 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
12b70 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
12b80 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
12b90 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
12ba0 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
12bb0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
12bc0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
12bd0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
12be0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
12bf0 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
12c00 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
12c10 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
12c20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
12c30 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
12c40 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
12c50 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
12c60 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
12c70 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
12c80 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
12c90 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12ca0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
12cb0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
12cc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
12cd0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
12ce0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
12cf0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
12d00 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
12d10 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
12d20 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
12d30 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
12d40 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
12d50 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
12d60 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
12d70 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
12d80 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
12d90 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
12da0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
12db0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
12dc0 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
12dd0 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
12de0 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
12df0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
12e00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
12e10 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
12e20 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
12e30 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
12e40 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
12e50 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
12e60 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
12e70 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
12e80 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
12e90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
12ea0 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
12eb0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
12ec0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
12ed0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
12ee0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
12ef0 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
12f00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
12f10 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
12f20 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55  rt( id!=0 );.  U
12f30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12f40 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d  pVfs);..  pFile-
12f50 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
12f60 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a  DLE_VALUE;..  /*
12f70 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12f80 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12f90 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
12fa0 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20  , generate a .  
12fb0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
12fc0 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20  e name to use . 
12fd0 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38   */.  if( !zUtf8
12fe0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Name ){.    asse
12ff0 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
13000 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  isOpenJournal);.
13010 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
13020 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c  name(MAX_PATH+1,
13030 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
13040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13050 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
13060 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13070 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70  zUtf8Name = zTmp
13080 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
13090 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
130a0 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
130b0 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
130c0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
130d0 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
130e0 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  me(zUtf8Name);. 
130f0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
13100 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
13110 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13120 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
13130 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
13140 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
13150 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
13160 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
13170 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
13180 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
13190 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
131a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
131b0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
131c0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
131d0 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
131e0 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  s .  ** created.
131f0 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
13200 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
13210 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
13220 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69  cess" .  ** as i
13230 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
13240 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
13250 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
13260 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
13270 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
13280 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
13290 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
132a0 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
132b0 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
132c0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
132d0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
132e0 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
132f0 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
13300 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
13310 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
13320 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
13330 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
13340 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
13350 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
13360 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
13370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
13380 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
13390 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
133a0 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
133b0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
133c0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
133d0 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
133e0 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
133f0 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
13400 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
13410 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
13420 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
13430 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
13440 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
13450 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
13460 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
13470 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
13480 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
13490 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
134a0 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
134d0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
134e0 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
13510 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
13520 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
13530 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
13540 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
13550 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
13560 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
13570 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
13580 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
13590 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
135a0 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
135b0 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
135c0 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
135d0 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
135e0 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
135f0 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
13600 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
13610 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
13620 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
13630 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  if..  if( isNT()
13640 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   ){.    while( (
13650 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28  h = CreateFileW(
13660 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
13670 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
136a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
136c0 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
136f0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
13700 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
13720 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
13730 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44   NULL))==INVALID
13760 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
13770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
13790 72 79 49 6f 65 72 72 28 26 63 6e 74 29 20 29 7b  ryIoerr(&cnt) ){
137a0 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  }./* isNT() is 1
137b0 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
137c0 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
137d0 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
137e0 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
137f0 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
13800 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
13810 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
13820 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
13830 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
13840 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
13850 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
13860 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
13870 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13880 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
13890 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 43 72    while( (h = Cr
138a0 65 61 74 65 46 69 6c 65 41 28 28 63 68 61 72 2a  eateFileA((char*
138b0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
138e0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
13910 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
13940 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13960 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
13970 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
139a0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
139b0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139d0 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72        retryIoerr
139e0 28 26 63 6e 74 29 20 29 7b 7d 0a 23 65 6e 64 69  (&cnt) ){}.#endi
139f0 66 0a 20 20 7d 0a 0a 20 20 6c 6f 67 49 6f 65 72  f.  }..  logIoer
13a00 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41  r(cnt);..  OSTRA
13a10 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 20  CE(("OPEN %d %s 
13a20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20  0x%lx %s\n", .  
13a30 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d           h, zNam
13a40 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65  e, dwDesiredAcce
13a50 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ss, .           
13a60 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
13a70 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69 6c 65  E_VALUE ? "faile
13a80 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
13a90 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
13aa0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
13ab0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13ac0 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
13ad0 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
13ae0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
13af0 54 4f 50 45 4e 2c 20 22 77 69 6e 4f 70 65 6e 22  TOPEN, "winOpen"
13b00 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20  , zUtf8Name);.  
13b10 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
13b20 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65  d);.    if( isRe
13b30 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
13b40 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
13b50 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28   return winOpen(
13b60 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c  pVfs, zName, id,
13b70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
13b80 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50  (flags|SQLITE_OP
13b90 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28 53  EN_READONLY)&~(S
13ba0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13bb0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  E|SQLITE_OPEN_RE
13bc0 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74 46  ADWRITE)), pOutF
13bd0 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lags);.    }else
13be0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
13bf0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
13c00 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
13c10 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
13c20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  ){.    if( isRea
13c30 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  dWrite ){.      
13c40 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
13c50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13c60 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
13c70 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
13c80 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
13c90 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
13ca0 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  }..  memset(pFil
13cb0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46  e, 0, sizeof(*pF
13cc0 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  ile));.  pFile->
13cd0 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f  pMethod = &winIo
13ce0 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d  Method;.  pFile-
13cf0 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d  >h = h;.  pFile-
13d00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f  >lastErrno = NO_
13d10 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e  ERROR;.  pFile->
13d20 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
13d30 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  File->pShm = 0;.
13d40 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
13d50 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c 65 2d   zName;.  pFile-
13d60 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 67 65  >sectorSize = ge
13d70 74 53 65 63 74 6f 72 53 69 7a 65 28 70 56 66 73  tSectorSize(pVfs
13d80 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 0a 23  , zUtf8Name);..#
13d90 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
13da0 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  CE.  if( isReadW
13db0 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53  rite && eType==S
13dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
13dd0 44 42 0a 20 20 20 20 20 20 20 26 26 20 21 77 69  DB.       && !wi
13de0 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
13df0 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b  ame, pFile).  ){
13e00 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
13e10 28 68 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43  (h);.    free(zC
13e20 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72  onverted);.    r
13e30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
13e40 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a  TOPEN_BKPT;.  }.
13e50 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a    if( isTemp ){.
13e60 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65      pFile->zDele
13e70 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e  teOnClose = zCon
13e80 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a  verted;.  }else.
13e90 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 66  #endif.  {.    f
13ea0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
13eb0 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e  .  }..  OpenCoun
13ec0 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
13ed0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
13ee0 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
13ef0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
13f00 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f   that windows do
13f10 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
13f20 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
13f30 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
13f40 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
13f50 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
13f60 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
13f70 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
13f80 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
13f90 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
13fa0 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
13fb0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
13fc0 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
13fd0 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
13fe0 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
13ff0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
14000 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
14010 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
14020 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
14030 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
14040 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
14050 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
14060 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
14070 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
14080 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
14090 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
140a0 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
140b0 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
140c0 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
140d0 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
140e0 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
140f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
14100 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
14110 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
14130 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
14140 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
14150 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
14160 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
14170 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
14180 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
14190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
141a0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
141b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
141c0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
141d0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
141e0 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
141f0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
14200 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14210 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
14220 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
14230 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14240 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e  _DELETE);.  zCon
14250 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
14260 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
14270 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
14280 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
14290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
142a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
142b0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
142c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68 69   rc = 1;.    whi
142d0 6c 65 28 20 47 65 74 46 69 6c 65 41 74 74 72 69  le( GetFileAttri
142e0 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65  butesW(zConverte
142f0 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  d)!=INVALID_FILE
14300 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
14310 20 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20            (rc = 
14320 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
14330 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20 72  verted))==0 && r
14340 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 29 20  etryIoerr(&cnt) 
14350 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72 63 20  ){}.    rc = rc 
14360 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
14370 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 2f 2a 20 69  LITE_ERROR;./* i
14380 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
14390 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
143a0 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
143b0 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
143c0 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
143d0 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66  ASCII version of
143e0 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
143f0 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
14400 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
14410 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
14420 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
14430 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
14440 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
14450 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
14460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
14470 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 47   1;.    while( G
14480 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
14490 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d 49  A(zConverted)!=I
144a0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
144b0 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
144c0 20 20 20 20 20 28 72 63 20 3d 20 44 65 6c 65 74       (rc = Delet
144d0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
144e0 64 29 29 3d 3d 30 20 26 26 20 72 65 74 72 79 49  d))==0 && retryI
144f0 6f 65 72 72 28 26 63 6e 74 29 20 29 7b 7d 0a 20  oerr(&cnt) ){}. 
14500 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53 51 4c     rc = rc ? SQL
14510 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
14520 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20 20  ERROR;.#endif.  
14530 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  }.  if( rc ){.  
14540 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
14550 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14560 44 45 4c 45 54 45 2c 20 22 77 69 6e 44 65 6c 65  DELETE, "winDele
14570 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  te", zFilename);
14580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
14590 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d  gIoerr(cnt);.  }
145a0 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  .  free(zConvert
145b0 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ed);.  OSTRACE((
145c0 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20 25  "DELETE \"%s\" %
145d0 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  s\n", zFilename,
145e0 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20   (rc ? "failed" 
145f0 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72 65  : "ok" )));.  re
14600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14610 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73  * Check the exis
14620 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73  tance and status
14630 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73   of a file..*/.s
14640 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63  tatic int winAcc
14650 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
14660 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
14670 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
14680 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
14690 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
146a0 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
146b0 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
146c0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
146d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146e0 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20  /* Type of test 
146f0 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20  to make on this 
14700 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  file */.  int *p
14710 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
14720 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73       /* OUT: Res
14730 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52  ult */.){.  DWOR
14740 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
14750 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43   = 0;.  void *zC
14760 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
14770 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
14780 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  s);..  SimulateI
14790 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
147a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
147b0 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72  SS; );.  zConver
147c0 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
147d0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
147e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
147f0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
14800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14810 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
14820 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  isNT() ){.    in
14830 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
14840 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
14850 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
14860 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
14870 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
14880 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
14890 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
148a0 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  c = GetFileAttri
148b0 62 75 74 65 73 45 78 57 28 28 57 43 48 41 52 2a  butesExW((WCHAR*
148c0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
148f0 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
14900 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
14920 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72  sAttrData)) && r
14930 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 29 20  etryIoerr(&cnt) 
14940 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29  ){}.    if( rc )
14950 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61  {.      /* For a
14960 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  n SQLITE_ACCESS_
14970 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72  EXISTS query, tr
14980 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  eat a zero-lengt
14990 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  h file.      ** 
149a0 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  as if it does no
149b0 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
149c0 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66  /.      if(    f
149d0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
149e0 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20  ESS_EXISTS.     
149f0 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
14a00 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d  a.nFileSizeHigh=
14a10 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
14a20 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
14a30 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20  SizeLow==0 ){.  
14a40 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
14a50 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
14a60 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTES;.      }els
14a70 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
14a80 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
14a90 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
14aa0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
14ab0 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72 28  .      logIoerr(
14ac0 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
14ad0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
14ae0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
14af0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
14b00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14b10 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
14b20 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46   "winAccess", zF
14b30 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
14b40 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
14b50 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
14b60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14b70 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65  ACCESS;.      }e
14b80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
14b90 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
14ba0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
14bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69 73     }.    }./* is
14bc0 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
14bd0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
14be0 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
14bf0 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
14c00 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
14c10 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
14c20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
14c30 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
14c40 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
14c50 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
14c60 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
14c70 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
14c80 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
14c90 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
14ca0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
14cb0 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
14cc0 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
14cd0 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
14ce0 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76    }.  free(zConv
14cf0 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
14d00 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
14d10 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
14d20 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
14d30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
14d40 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
14d50 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
14d60 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
14d70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14d80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
14d90 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
14da0 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
14db0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
14dc0 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
14dd0 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26           (attr &
14de0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
14df0 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20  READONLY)==0;.  
14e00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
14e10 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
14e20 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
14e30 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
14e40 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
14e50 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53  = rc;.  return S
14e60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
14e70 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
14e80 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
14e90 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
14ea0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75  e.  Write the fu
14eb0 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69  ll.** pathname i
14ec0 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75  nto zOut[].  zOu
14ed0 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c  t[] will be at l
14ee0 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  east pVfs->mxPat
14ef0 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69  hname.** bytes i
14f00 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
14f10 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74  c int winFullPat
14f20 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
14f30 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
14f40 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
14f50 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
14f60 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14f70 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20  *zRelative,     
14f80 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
14f90 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
14fa0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c  th */.  int nFul
14fb0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
14fc0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
14fd0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
14fe0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
14ff0 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
15000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
15010 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
15020 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  {.  .#if defined
15030 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
15040 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
15050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15060 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
15070 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
15080 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  ;.  cygwin_conv_
15090 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61  to_full_win32_pa
150a0 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  th(zRelative, zF
150b0 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ull);.  return S
150c0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
150d0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
150e0 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61 74 65  WINCE.  Simulate
150f0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
15100 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
15110 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
15120 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f 2a 20  ER(nFull);.  /* 
15130 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e  WinCE has no con
15140 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69  cept of a relati
15150 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20  ve pathname, or 
15160 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f  so I am told. */
15170 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
15180 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ntf(pVfs->mxPath
15190 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  name, zFull, "%s
151a0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
151b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
151c0 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  K;.#endif..#if !
151d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
151e0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
151f0 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42  GWIN__).  int nB
15200 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  yte;.  void *zCo
15210 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20  nverted;.  char 
15220 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  *zOut;..  /* If 
15230 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62  this path name b
15240 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22  egins with "/X:"
15250 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61  , where "X" is a
15260 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20  ny alphabetic.  
15270 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69  ** character, di
15280 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61  scard the initia
15290 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70  l "/" from the p
152a0 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  athname..  */.  
152b0 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d  if( zRelative[0]
152c0 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33  =='/' && sqlite3
152d0 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76  Isalpha(zRelativ
152e0 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69  e[1]) && zRelati
152f0 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20  ve[2]==':' ){.  
15300 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20    zRelative++;. 
15310 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64   }..  /* It's od
15320 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
15330 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
15340 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
15350 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
15360 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
15370 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
15380 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
15390 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
153a0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
153b0 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
153c0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
153d0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
153e0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
153f0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
15400 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
15410 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
15420 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
15430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
15440 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  OR );.  UNUSED_P
15450 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b  ARAMETER(nFull);
15460 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
15470 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
15480 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ame(zRelative);.
15490 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
154a0 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70      WCHAR *zTemp
154b0 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65  ;.    nByte = Ge
154c0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
154d0 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
154e0 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b  d, 0, 0, 0) + 3;
154f0 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c  .    zTemp = mal
15500 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
15510 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
15520 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
15530 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43  ){.      free(zC
15540 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
15550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15560 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
15570 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
15580 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
15590 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
155a0 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28  p, 0);.    free(
155b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
155c0 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
155d0 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  oUtf8(zTemp);.  
155e0 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 2f    free(zTemp);./
155f0 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
15600 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
15610 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
15620 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
15630 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
15640 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
15650 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
15660 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
15670 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
15680 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
15690 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
156a0 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
156b0 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
156c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
156d0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
156e0 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
156f0 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
15700 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
15710 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
15720 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54  , 0) + 3;.    zT
15730 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42  emp = malloc( nB
15740 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
15750 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
15760 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
15770 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
15780 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
15790 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
157a0 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c     }.    GetFull
157b0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
157c0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
157d0 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
157e0 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
157f0 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
15800 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
15810 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
15820 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 65 6d  );.    free(zTem
15830 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  p);.#endif.  }. 
15840 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20   if( zOut ){.   
15850 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
15860 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  f(pVfs->mxPathna
15870 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  me, zFull, "%s",
15880 20 7a 4f 75 74 29 3b 0a 20 20 20 20 66 72 65 65   zOut);.    free
15890 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
158a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
158b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
158c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
158d0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
158e0 0a 2a 2a 20 47 65 74 20 74 68 65 20 73 65 63 74  .** Get the sect
158f0 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  or size of the d
15900 65 76 69 63 65 20 75 73 65 64 20 74 6f 20 73 74  evice used to st
15910 6f 72 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a  ore.** file..*/.
15920 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 65  static int getSe
15930 63 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71  ctorSize(.    sq
15940 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
15950 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
15960 2a 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f  *zRelative     /
15970 2a 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d  * UTF-8 file nam
15980 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  e */.){.  DWORD 
15990 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d  bytesPerSector =
159a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
159b0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f  SECTOR_SIZE;.  /
159c0 2a 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  * GetDiskFreeSpa
159d0 63 65 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72  ce is not suppor
159e0 74 65 64 20 75 6e 64 65 72 20 57 49 4e 43 45 20  ted under WINCE 
159f0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
15a00 5f 57 49 4e 43 45 0a 20 20 55 4e 55 53 45 44 5f  _WINCE.  UNUSED_
15a10 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
15a20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
15a30 54 45 52 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a  TER(zRelative);.
15a40 23 65 6c 73 65 0a 20 20 63 68 61 72 20 7a 46 75  #else.  char zFu
15a50 6c 6c 70 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b  llpath[MAX_PATH+
15a60 31 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  1];.  int rc;.  
15a70 44 57 4f 52 44 20 64 77 52 65 74 20 3d 20 30 3b  DWORD dwRet = 0;
15a80 0a 20 20 44 57 4f 52 44 20 64 77 44 75 6d 6d 79  .  DWORD dwDummy
15a90 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20  ;..  /*.  ** We 
15aa0 6e 65 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  need to get the 
15ab0 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 20 6f  full path name o
15ac0 66 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  f the file.  ** 
15ad0 74 6f 20 67 65 74 20 74 68 65 20 64 72 69 76 65  to get the drive
15ae0 20 6c 65 74 74 65 72 20 74 6f 20 6c 6f 6f 6b 20   letter to look 
15af0 75 70 20 74 68 65 20 73 65 63 74 6f 72 0a 20 20  up the sector.  
15b00 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ** size..  */.  
15b10 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
15b20 65 6e 69 67 6e 28 31 29 3b 0a 20 20 72 63 20 3d  enign(1);.  rc =
15b30 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
15b40 28 70 56 66 73 2c 20 7a 52 65 6c 61 74 69 76 65  (pVfs, zRelative
15b50 2c 20 4d 41 58 5f 50 41 54 48 2c 20 7a 46 75 6c  , MAX_PATH, zFul
15b60 6c 70 61 74 68 29 3b 0a 20 20 53 69 6d 75 6c 61  lpath);.  Simula
15b70 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
15b80 30 29 3b 0a 20 20 69 66 28 20 72 63 20 3d 3d 20  0);.  if( rc == 
15b90 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20 7b 0a  SQLITE_OK ).  {.
15ba0 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65      void *zConve
15bb0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
15bc0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c  f8Filename(zFull
15bd0 70 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  path);.    if( z
15be0 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
15bf0 20 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b     if( isNT() ){
15c00 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d  .        /* trim
15c10 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72   path to just dr
15c20 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ive reference */
15c30 0a 20 20 20 20 20 20 20 20 57 43 48 41 52 20 2a  .        WCHAR *
15c40 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  p = zConverted;.
15c50 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b          for(;*p;
15c60 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
15c70 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29  if( *p == '\\' )
15c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
15c90 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
15ca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15cc0 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65 74 20  }.        dwRet 
15cd0 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  = GetDiskFreeSpa
15ce0 63 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  ceW((WCHAR*)zCon
15cf0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d            &dwDum
15d20 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  my,.            
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 20 20 20 20 26 62 79 74 65 73 50 65 72 53        &bytesPerS
15d50 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  ector,.         
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
15d80 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a       &dwDummy);.
15db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15dc0 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74       /* trim pat
15dd0 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20  h to just drive 
15de0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20  reference */.   
15df0 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28       char *p = (
15e00 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72 74 65  char *)zConverte
15e10 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  d;.        for(;
15e20 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  *p;p++){.       
15e30 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c     if( *p == '\\
15e40 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
15e50 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20   *p = '\0';.    
15e60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15e70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52     }.        dwR
15e90 65 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65  et = GetDiskFree
15ea0 53 70 61 63 65 41 28 28 63 68 61 72 2a 29 7a 43  SpaceA((char*)zC
15eb0 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
15ee0 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ummy,.          
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 20 20 20 26 62 79 74 65 73 50 65          &bytesPe
15f10 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20  rSector,.       
15f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f30 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
15f40 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mmy,.           
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f60 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29         &dwDummy)
15f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15f80 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
15f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15fa0 21 64 77 52 65 74 20 29 7b 0a 20 20 20 20 20 20  !dwRet ){.      
15fb0 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d  bytesPerSector =
15fc0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15fd0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20  SECTOR_SIZE;.   
15fe0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
15ff0 72 65 74 75 72 6e 20 28 69 6e 74 29 20 62 79 74  return (int) byt
16000 65 73 50 65 72 53 65 63 74 6f 72 3b 20 0a 7d 0a  esPerSector; .}.
16010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16020 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
16030 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
16040 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
16050 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
16060 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
16070 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
16080 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
16090 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
160a0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
160b0 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49  rary..*/./*.** I
160c0 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
160d0 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
160e0 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
160f0 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
16100 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
16110 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
16120 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
16130 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74  d library..*/.st
16140 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c  atic void *winDl
16150 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
16160 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
16170 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
16180 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f    HANDLE h;.  vo
16190 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
161a0 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
161b0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
161c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
161d0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28  TER(pVfs);.  if(
161e0 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
161f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
16200 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
16210 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64   ){.    h = Load
16220 4c 69 62 72 61 72 79 57 28 28 57 43 48 41 52 2a  LibraryW((WCHAR*
16230 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 2f 2a  )zConverted);./*
16240 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
16250 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
16260 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
16270 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
16280 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68  ed. .** Since th
16290 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20  e ASCII version 
162a0 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73  of these Windows
162b0 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73   API do not exis
162c0 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20  t for WINCE,.** 
162d0 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  it's important t
162e0 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  o not reference 
162f0 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62  them for WINCE b
16300 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51  uilds..*/.#if SQ
16310 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
16320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20  .  }else{.    h 
16330 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  = LoadLibraryA((
16340 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
16350 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
16360 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
16370 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
16380 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  *)h;.}.static vo
16390 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71  id winDlError(sq
163a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
163b0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
163c0 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55  *zBufOut){.  UNU
163d0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
163e0 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72  fs);.  getLastEr
163f0 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75  rorMsg(nBuf, zBu
16400 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20  fOut);.}.static 
16410 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28  void (*winDlSym(
16420 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
16430 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
16440 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
16450 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20  ymbol))(void){. 
16460 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
16470 52 28 70 56 66 73 29 3b 0a 23 69 66 20 53 51 4c  R(pVfs);.#if SQL
16480 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
16490 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
164a0 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
164b0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
164c0 65 20 6f 6e 20 77 69 6e 63 65 2e 20 2a 2f 0a 20  e on wince. */. 
164d0 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29   return (void(*)
164e0 28 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64  (void))GetProcAd
164f0 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
16500 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
16510 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c  ;.#else.  /* All
16520 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 73 20 70   other windows p
16530 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20  latforms expect 
16540 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29  GetProcAddress()
16550 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e   to take.  ** an
16560 20 41 6e 73 69 20 73 74 72 69 6e 67 20 72 65 67   Ansi string reg
16570 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f  ardless of the _
16580 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20  UNICODE setting 
16590 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  */.  return (voi
165a0 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72  d(*)(void))GetPr
165b0 6f 63 41 64 64 72 65 73 73 28 28 48 41 4e 44 4c  ocAddress((HANDL
165c0 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  E)pHandle, zSymb
165d0 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74  ol);.#endif.}.st
165e0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
165f0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
16600 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
16610 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
16620 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
16630 3b 0a 20 20 46 72 65 65 4c 69 62 72 61 72 79 28  ;.  FreeLibrary(
16640 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
16650 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
16660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
16670 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
16680 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
16690 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30  ine winDlOpen  0
166a0 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
166b0 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
166c0 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20  e winDlSym   0. 
166d0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c   #define winDlCl
166e0 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ose 0.#endif.../
166f0 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
16700 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
16710 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
16720 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
16730 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
16740 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
16750 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
16760 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74  ar *zBuf){.  int
16770 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44   n = 0;.  UNUSED
16780 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
16790 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
167a0 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d  LITE_TEST).  n =
167b0 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28   nBuf;.  memset(
167c0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
167d0 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
167e0 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d  of(SYSTEMTIME)<=
167f0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59  nBuf-n ){.    SY
16800 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20  STEMTIME x;.    
16810 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78  GetSystemTime(&x
16820 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
16830 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65  Buf[n], &x, size
16840 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(x));.    n +=
16850 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a   sizeof(x);.  }.
16860 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
16870 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
16880 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 47     DWORD pid = G
16890 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
168a0 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
168b0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
168c0 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
168d0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
168e0 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  id);.  }.  if( s
168f0 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
16900 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
16910 44 20 63 6e 74 20 3d 20 47 65 74 54 69 63 6b 43  D cnt = GetTickC
16920 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ount();.    memc
16930 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
16940 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
16950 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
16960 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (cnt);.  }.  if(
16970 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
16980 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
16990 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
169a0 47 45 52 20 69 3b 0a 20 20 20 20 51 75 65 72 79  GER i;.    Query
169b0 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
169c0 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63  er(&i);.    memc
169d0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c  py(&zBuf[n], &i,
169e0 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20   sizeof(i));.   
169f0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b   n += sizeof(i);
16a00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
16a10 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
16a20 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
16a30 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
16a40 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
16a50 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
16a60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
16a70 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
16a80 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
16a90 6f 73 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28  osec){.  Sleep((
16aa0 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
16ab0 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
16ac0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
16ad0 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
16ae0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
16af0 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
16b00 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
16b10 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
16b20 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
16b30 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
16b40 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
16b50 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
16b60 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
16b70 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
16b80 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
16b90 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
16ba0 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
16bb0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16bc0 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
16bd0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
16be0 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
16bf0 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
16c00 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
16c10 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
16c20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
16c30 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
16c40 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
16c50 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
16c60 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
16c70 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
16c80 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
16c90 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
16ca0 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
16cb0 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
16cc0 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
16cd0 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
16ce0 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
16cf0 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
16d00 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
16d10 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
16d20 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
16d30 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
16d40 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
16d50 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
16d60 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
16d70 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
16d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16d90 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
16da0 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
16db0 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
16dc0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
16dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16de0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
16df0 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
16e00 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
16e10 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
16e20 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
16e30 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
16e40 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
16e50 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
16e60 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
16e70 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
16e80 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
16e90 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
16ea0 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
16eb0 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
16ec0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
16ed0 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
16ee0 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
16ef0 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
16f00 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
16f10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16f20 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
16f30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
16f40 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
16f50 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
16f60 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
16f70 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
16f80 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
16f90 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
16fa0 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
16fb0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
16fc0 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
16fd0 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71  lue = .      (sq
16fe0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
16ff0 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
17000 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
17010 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
17020 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a  t64)294967296;..
17030 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
17040 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  NCE.  SYSTEMTIME
17050 20 74 69 6d 65 3b 0a 20 20 47 65 74 53 79 73 74   time;.  GetSyst
17060 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20  emTime(&time);. 
17070 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d   /* if SystemTim
17080 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61  eToFileTime() fa
17090 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ils, it returns 
170a0 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21  zero. */.  if (!
170b0 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
170c0 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
170d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
170e0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
170f0 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74 65 6d  else.  GetSystem
17100 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20  TimeAsFileTime( 
17110 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  &ft );.#endif.. 
17120 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c   *piNow = winFil
17130 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20  etimeEpoch +.   
17140 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c           ((((sql
17150 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
17160 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61  HighDateTime)*ma
17170 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a  x32BitValue) + .
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
17190 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
171a0 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
171b0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31  (sqlite3_int64)1
171c0 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51  0000;..#ifdef SQ
171d0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
171e0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
171f0 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
17200 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
17210 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
17220 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
17230 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
17240 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
17250 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
17260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17270 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  OK;.}../*.** Fin
17280 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
17290 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
172a0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
172b0 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
172c0 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
172d0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
172e0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
172f0 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
17300 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
17310 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
17320 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
17330 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
17340 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
17350 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
17360 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62  _vfs *pVfs, doub
17370 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e  le *prNow){.  in
17380 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
17390 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20  int64 i;.  rc = 
173a0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
173b0 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20  t64(pVfs, &i);. 
173c0 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
173d0 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
173e0 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74  000.0;.  }.  ret
173f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17400 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
17410 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
17420 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d  works like a com
17430 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47  bination of.** G
17440 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e  etLastError() an
17450 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28  d FormatMessage(
17460 29 20 6f 6e 20 77 69 6e 64 6f 77 73 20 28 6f 72  ) on windows (or
17470 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74   errno and.** st
17480 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 75 6e  rerror_r() on un
17490 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72  ix). After an er
174a0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
174b0 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63  by an OS.** func
174c0 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c  tion, SQLite cal
174d0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
174e0 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74   with zBuf point
174f0 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66  ing to.** a buff
17500 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73  er of nBuf bytes
17510 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73  . The OS layer s
17520 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74  hould populate t
17530 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74  he.** buffer wit
17540 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  h a nul-terminat
17550 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  ed UTF-8 encoded
17560 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
17570 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  * describing the
17580 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74   last IO error t
17590 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  o have occurred 
175a0 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69  within the calli
175b0 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a  ng.** thread..**
175c0 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72  .** If the error
175d0 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   message is too 
175e0 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75  large for the su
175f0 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a  pplied buffer,.*
17600 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74  * it should be t
17610 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65  runcated. The re
17620 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47  turn value of xG
17630 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69  etLastError.** i
17640 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
17650 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
17660 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
17670 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
17680 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
17690 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
176a0 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d  ncated). If non-
176b0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
176c0 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20  ,.** then it is 
176d0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
176e0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
176f0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72  -terminator char
17700 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20  acter.** in the 
17710 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a  output buffer..*
17720 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69  *.** Not supplyi
17730 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ng an error mess
17740 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f  age will have no
17750 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a   adverse effect.
17760 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74  ** on SQLite. It
17770 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65   is fine to have
17780 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   an implementati
17790 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a  on that never.**
177a0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
177b0 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  r message:.**.**
177c0 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45     int xGetLastE
177d0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
177e0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
177f0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a  , char *zBuf){.*
17800 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75  *     assert(zBu
17810 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20  f[0]=='\0');.** 
17820 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a      return 0;.**
17830 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76     }.**.** Howev
17840 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d  er if an error m
17850 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69  essage is suppli
17860 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69  ed, it will be i
17870 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62  ncorporated.** b
17880 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68  y sqlite into th
17890 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
178a0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
178b0 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73   user using.** s
178c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c  qlite3_errmsg(),
178d0 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67   possibly making
178e0 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65   IO errors easie
178f0 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73  r to debug..*/.s
17900 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
17910 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
17920 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
17930 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
17940 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
17950 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
17960 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72  return getLastEr
17970 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75  rorMsg(nBuf, zBu
17980 66 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49  f);.}..../*.** I
17990 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65  nitialize and de
179a0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  initialize the o
179b0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
179c0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
179d0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  t sqlite3_os_ini
179e0 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
179f0 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
17a00 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  nVfs = {.    3, 
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
17a30 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
17a40 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
17a50 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58  sFile */.    MAX
17a60 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 20  _PATH,          
17a70 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20    /* mxPathname 
17a80 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
17a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
17aa0 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e  Next */.    "win
17ab0 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  32",            
17ac0 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
17ad0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
17ae0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
17af0 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
17b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17b10 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69   xOpen */.    wi
17b20 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  nDelete,        
17b30 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
17b40 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
17b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
17b60 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46  cess */.    winF
17b70 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
17b80 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
17b90 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
17ba0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
17bb0 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
17bc0 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  winDlError,     
17bd0 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
17be0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
17bf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17c00 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
17c10 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
17c20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
17c30 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
17c40 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52  ess,       /* xR
17c50 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20  andomness */.   
17c60 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20   winSleep,      
17c70 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
17c80 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
17c90 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78  tTime,      /* x
17ca0 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
17cb0 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72     winGetLastErr
17cc0 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  or,     /* xGetL
17cd0 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
17ce0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
17cf0 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74  t64, /* xCurrent
17d00 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20  TimeInt64 */.   
17d10 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
17d20 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73        /* xSetSys
17d30 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 30  temCall */.    0
17d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17d50 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
17d60 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 30 2c 20  mCall */.    0, 
17d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d80 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
17d90 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 23 69  Call */.  };..#i
17da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17db0 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d  T_WAL.  /* get m
17dc0 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61  emory map alloca
17dd0 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79  tion granularity
17de0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69   */.  memset(&wi
17df0 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  nSysInfo, 0, siz
17e00 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29  eof(SYSTEM_INFO)
17e10 29 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 49 6e  );.  GetSystemIn
17e20 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
17e30 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53 79 73  .  assert(winSys
17e40 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
17e50 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30  nGranularity > 0
17e60 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
17e70 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
17e80 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20  r(&winVfs, 1);. 
17e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17ea0 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  K; .}.int sqlite
17eb0 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
17ec0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17ed0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
17ee0 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  * SQLITE_OS_WIN 
17ef0 2a 2f 0a                                         */.