/ Hex Artifact Content
Login

Artifact 45de13c6c3501cfd6469b2b34149b823060e39f4:


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 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
91c0: 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  UG) || !defined(
91d0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20  SQLITE_NO_SYNC) 
91e0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
91f0: 45 5f 44 45 42 55 47 29 0a 20 20 77 69 6e 46 69  E_DEBUG).  winFi
9200: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
9210: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 42 4f 4f 4c  File*)id;.  BOOL
9220: 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55   rc;.#else.  UNU
9230: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
9240: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
9250: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
9260: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
9270: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
9280: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
9290: 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
92a0: 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
92b0: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
92c0: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
92d0: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
92e0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
92f0: 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28    );..  OSTRACE(
9300: 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25  ("SYNC %d lock=%
9310: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
9320: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
9330: 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
9340: 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
9350: 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
9360: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
9370: 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
9380: 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
9390: 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
93a0: 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
93b0: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
93c0: 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
93d0: 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
93e0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
93f0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
9400: 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  E_TEST.  UNUSED_
9410: 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
9420: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66  ;.#else.  if( (f
9430: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
9440: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a  TE_SYNC_FULL ){.
9450: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c      sqlite3_full
9460: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
9470: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  }.  sqlite3_sync
9480: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
9490: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
94a0: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
94b0: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
94c0: 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
94d0: 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
94e0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
94f0: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65  ITE_NO_SYNC.  re
9500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9510: 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 46 6c 75  #else.  rc = Flu
9520: 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
9530: 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c  ile->h);.  Simul
9540: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46  ateIOError( rc=F
9550: 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63  ALSE );.  if( rc
9560: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9570: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
9580: 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
9590: 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
95a0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65  tError();.    re
95b0: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
95c0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
95d0: 59 4e 43 2c 20 22 77 69 6e 53 79 6e 63 22 2c 20  YNC, "winSync", 
95e0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
95f0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
9600: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
9610: 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
9620: 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
9630: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9640: 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
9650: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
9660: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
9670: 65 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65  e){.  DWORD uppe
9680: 72 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c  rBits;.  DWORD l
9690: 6f 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46  owerBits;.  winF
96a0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
96b0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
96c0: 52 44 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73  RD error;..  ass
96d0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
96e0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
96f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9700: 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f  ERR_FSTAT);.  lo
9710: 77 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c  werBits = GetFil
9720: 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
9730: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69  &upperBits);.  i
9740: 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
9750: 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
9760: 53 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28  SIZE).     && ((
9770: 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45  error = GetLastE
9780: 72 72 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52  rror()) != NO_ER
9790: 52 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70  ROR) ).  {.    p
97a0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
97b0: 3d 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74  = error;.    ret
97c0: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
97d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
97e0: 41 54 2c 20 22 77 69 6e 46 69 6c 65 53 69 7a 65  AT, "winFileSize
97f0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
9800: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
9810: 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   (((sqlite3_int6
9820: 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32  4)upperBits)<<32
9830: 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ) + lowerBits;. 
9840: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9850: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  K;.}../*.** LOCK
9860: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
9870: 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
9880: 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
9890: 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
98a0: 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
98b0: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
98c0: 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
98d0: 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
98e0: 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ELY 1.#endif../*
98f0: 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
9900: 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
9910: 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
9920: 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
9930: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
9940: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
9950: 0a 2a 2a 20 69 73 20 57 69 6e 39 35 20 6f 72 20  .** is Win95 or 
9960: 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
9970: 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b   int getReadLock
9980: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
9990: 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  {.  int res;.  i
99a0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
99b0: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
99c0: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
99d0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
99e0: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
99f0: 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20 6f  tHigh = 0;.    o
9a00: 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b 0a  vlp.hEvent = 0;.
9a10: 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69      res = LockFi
9a20: 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  leEx(pFile->h, L
9a30: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
9a40: 45 44 49 41 54 45 4c 59 2c 0a 20 20 20 20 20 20  EDIATELY,.      
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
9a60: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
9a70: 2c 20 26 6f 76 6c 70 29 3b 0a 2f 2a 20 69 73 4e  , &ovlp);./* isN
9a80: 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
9a90: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
9aa0: 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
9ab0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
9ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
9ad0: 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
9ae0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
9af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
9b00: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
9b10: 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
9b20: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
9b30: 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
9b40: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
9b50: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
9b60: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63  );.    res = Loc
9b70: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
9b80: 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69  SHARED_FIRST+pFi
9b90: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
9ba0: 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  te, 0, 1, 0);.#e
9bb0: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 72  ndif.  }.  if( r
9bc0: 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70  es == 0 ){.    p
9bd0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
9be0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
9bf0: 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ;.    /* No need
9c00: 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72   to log a failur
9c10: 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  e to lock */.  }
9c20: 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
9c30: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72  ../*.** Undo a r
9c40: 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  eadlock.*/.stati
9c50: 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64  c int unlockRead
9c60: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
9c70: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
9c80: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
9c90: 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63  .    res = Unloc
9ca0: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
9cb0: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
9cc0: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
9cd0: 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
9ce0: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
9cf0: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
9d00: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
9d10: 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20  ecuted. .*/.#if 
9d20: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
9d30: 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
9d40: 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65  res = UnlockFile
9d50: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
9d60: 44 5f 46 49 52 53 54 20 2b 20 70 46 69 6c 65 2d  D_FIRST + pFile-
9d70: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
9d80: 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 1, 0);.#endi
9d90: 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 3d  f.  }.  if( res=
9da0: 3d 30 20 26 26 20 47 65 74 4c 61 73 74 45 72 72  =0 && GetLastErr
9db0: 6f 72 28 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f  or()!=ERROR_NOT_
9dc0: 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 70 46  LOCKED ){.    pF
9dd0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9de0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
9df0: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
9e00: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
9e10: 4c 4f 43 4b 2c 20 22 75 6e 6c 6f 63 6b 52 65 61  LOCK, "unlockRea
9e20: 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
9e30: 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Path);.  }.  ret
9e40: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
9e50: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
9e60: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
9e70: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
9e80: 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
9e90: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
9ea0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
9eb0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
9ec0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
9ed0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
9ee0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
9ef0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
9f00: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
9f10: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
9f20: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
9f30: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
9f40: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
9f50: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
9f60: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
9f70: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
9f80: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
9f90: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
9fa0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
9fb0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
9fc0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
9fd0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
9fe0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
9ff0: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
a000: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
a010: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
a020: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
a030: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
a040: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
a050: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
a060: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
a070: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
a080: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
a090: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
a0a0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
a0b0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
a0c0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
a0d0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
a0e0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
a0f0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
a100: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a110: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
a120: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
a130: 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75   winUnlock() rou
a140: 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61  tine.** erases a
a150: 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65  ll locks at once
a160: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20   and returns us 
a170: 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c  immediately to l
a180: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
a190: 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
a1a0: 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74  sible to lower t
a1b0: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
a1c0: 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74   one step at a t
a1d0: 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73  ime.  You.** mus
a1e0: 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f  t go straight to
a1f0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
a200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a210: 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  winLock(sqlite3_
a220: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
a230: 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
a240: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
a250: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
a260: 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
a270: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  s */.  int res =
a280: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
a290: 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77 69 6e   Result of a win
a2a0: 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a  dows lock call *
a2b0: 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74  /.  int newLockt
a2c0: 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ype;       /* Se
a2d0: 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  t pFile->locktyp
a2e0: 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
a2f0: 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
a300: 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
a310: 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
a320: 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
a330: 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
a340: 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
a350: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
a360: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
a370: 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 4e   DWORD error = N
a380: 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65  O_ERROR;..  asse
a390: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f  rt( id!=0 );.  O
a3a0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 64  STRACE(("LOCK %d
a3b0: 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
a3c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
a3d0: 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
a3e0: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
a3f0: 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
a400: 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f  LockByte));..  /
a410: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
a420: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
a430: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
a440: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
a450: 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
a460: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
a470: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
a480: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
a490: 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
a4a0: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
a4b0: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
a4c0: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
a4d0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
a4e0: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
a4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a500: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
a510: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
a520: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
a530: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
a540: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
a550: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
a560: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
a570: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
a580: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
a590: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
a5a0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
a5b0: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
a5c0: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
a5d0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
a5e0: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
a5f0: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
a600: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
a610: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
a620: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
a630: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
a640: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
a650: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
a660: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
a670: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
a680: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
a690: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
a6a0: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
a6b0: 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
a6c0: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20  ocktype;.  if(  
a6d0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
a6e0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20  e==NO_LOCK).    
a6f0: 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70   || (   (locktyp
a700: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
a710: 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  K).         && (
a720: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
a730: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29  =RESERVED_LOCK))
a740: 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
a750: 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
a760: 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
a770: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69  s = LockFile(pFi
a780: 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42  le->h, PENDING_B
a790: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
a7a0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
a7b0: 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
a7c0: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
a7d0: 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e 67 20  k.  The pending 
a7e0: 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a 20 20  lock might be.  
a7f0: 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 61      ** held by a
a800: 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20 70 72  nother reader pr
a810: 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c 20 72  ocess who will r
a820: 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e 74  elease it moment
a830: 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  arily..      */.
a840: 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
a850: 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20  could not get a 
a860: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e  PENDING lock. cn
a870: 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a  t=%d\n", cnt));.
a880: 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a        Sleep(1);.
a890: 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e      }.    gotPen
a8a0: 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a  dingLock = res;.
a8b0: 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a      if( !res ){.
a8c0: 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 47 65        error = Ge
a8d0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
a8e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
a8f0: 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
a900: 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
a910: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
a920: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
a930: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
a940: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
a950: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
a960: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
a970: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
a980: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
a990: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
a9a0: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
a9b0: 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 47 65        error = Ge
a9c0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
a9d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
a9e0: 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
a9f0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
aa00: 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
aa10: 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  VED_LOCK && res 
aa20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
aa30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
aa40: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
aa50: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
aa60: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
aa70: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
aa80: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
aa90: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
aaa0: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
aab0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
aac0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
aad0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
aae0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
aaf0: 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  Acquire a PENDIN
ab00: 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  G lock.  */.  if
ab10: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
ab20: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
ab30: 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b  s ){.    newLock
ab40: 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  type = PENDING_L
ab50: 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64  OCK;.    gotPend
ab60: 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d  ingLock = 0;.  }
ab70: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
ab80: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
ab90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
aba0: 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
abb0: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
abc0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
abd0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52  ->locktype>=SHAR
abe0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
abf0: 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c  es = unlockReadL
ac00: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
ac10: 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65 61 64  OSTRACE(("unread
ac20: 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65  lock = %d\n", re
ac30: 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  s));.    res = L
ac40: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
ac50: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
ac60: 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
ac70: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
ac80: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
ac90: 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
aca0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
acb0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
acc0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
acd0: 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
ace0: 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c  error-code = %d\
acf0: 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20 20 20  n", error));.   
ad00: 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70     getReadLock(p
ad10: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
ad20: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
ad30: 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
ad40: 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
ad50: 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
ad60: 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
ad70: 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
ad80: 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
ad90: 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
ada0: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
adb0: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
adc0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  e(pFile->h, PEND
add0: 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
ade0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
adf0: 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
ae00: 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
ae10: 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
ae20: 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
ae30: 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
ae40: 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
ae50: 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
ae60: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
ae70: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ae80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52   }else{.    OSTR
ae90: 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45  ACE(("LOCK FAILE
aea0: 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20  D %d trying for 
aeb0: 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22  %d but got %d\n"
aec0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
aed0: 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c         locktype,
aee0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a   newLocktype));.
aef0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
af00: 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 20 20  rrno = error;.  
af10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
af20: 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  SY;.  }.  pFile-
af30: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
af40: 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  newLocktype;.  r
af50: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
af60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
af70: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
af80: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
af90: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
afa0: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
afb0: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
afc0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
afd0: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
afe0: 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
aff0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
b000: 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
b010: 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
b020: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
b030: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
b040: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
b050: 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69   int rc;.  winFi
b060: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
b070: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
b080: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
b090: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
b0a0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b0b0: 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72  OCK; );..  asser
b0c0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66  t( id!=0 );.  if
b0d0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
b0e0: 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
b0f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
b100: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
b110: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
b120: 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
b130: 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
b140: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c  else{.    rc = L
b150: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
b160: 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
b170: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
b180: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 55  f( rc ){.      U
b190: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
b1a0: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
b1b0: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
b1c0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b   }.    rc = !rc;
b1d0: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
b1e0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
b1f0: 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
b200: 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
b210: 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
b220: 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rc;.  return SQL
b230: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b240: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
b250: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
b260: 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74   descriptor id t
b270: 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
b280: 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
b290: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
b2a0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
b2b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
b2c0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
b2d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
b2e0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
b2f0: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
b300: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
b310: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
b320: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
b330: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ..**.** It is no
b340: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
b350: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  his routine to f
b360: 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ail if the secon
b370: 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
b380: 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68   NO_LOCK.  If th
b390: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b3a0: 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  t is SHARED_LOCK
b3b0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
b3c0: 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75  ne.** might retu
b3d0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
b3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b3f0: 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  inUnlock(sqlite3
b400: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
b410: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
b420: 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20  type;.  winFile 
b430: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
b440: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
b450: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
b460: 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
b470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
b480: 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
b490: 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  CK );.  OSTRACE(
b4a0: 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25  ("UNLOCK %d to %
b4b0: 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c  d was %d(%d)\n",
b4c0: 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
b4d0: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ype,.          p
b4e0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
b4f0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
b500: 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65 20  kByte));.  type 
b510: 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
b520: 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
b530: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
b540: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
b550: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
b560: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
b570: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
b580: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
b590: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65  ARED_LOCK && !ge
b5a0: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
b5b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
b5c0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
b5d0: 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
b5e0: 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
b5f0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
b600: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
b610: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
b620: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
b630: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b640: 43 4b 2c 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c  CK, "winUnlock",
b650: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
b660: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
b670: 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
b680: 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63  OCK ){.    Unloc
b690: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
b6a0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
b6b0: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
b6c0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
b6d0: 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
b6e0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
b6f0: 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
b700: 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
b710: 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
b720: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
b730: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
b740: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
b750: 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 1, 0);.  }.  p
b760: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
b770: 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
b780: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b790: 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
b7a0: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
b7b0: 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
b7c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
b7d0: 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
b7e0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
b7f0: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
b800: 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
b810: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
b820: 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  )id;.  switch( o
b830: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
b840: 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
b850: 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
b860: 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
b870: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  e->locktype;.   
b880: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b890: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
b8a0: 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
b8b0: 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
b8c0: 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
b8d0: 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
b8e0: 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
b8f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b900: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
b910: 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
b920: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
b930: 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
b940: 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
b950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b960: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
b970: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
b980: 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
b990: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
b9a0: 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
b9b0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
b9c0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
b9d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b9e0: 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20  _int64 oldSz;.  
b9f0: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
ba00: 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26  inFileSize(id, &
ba10: 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  oldSz);.        
ba20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ba30: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
ba40: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77  qlite3_int64 new
ba50: 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69  Sz = *(sqlite3_i
ba60: 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  nt64*)pArg;.    
ba70: 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e        if( newSz>
ba80: 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20  oldSz ){.       
ba90: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
baa0: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
bab0: 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
bac0: 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20  winTruncate(id, 
bad0: 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  newSz);.        
bae0: 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
baf0: 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
bb00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bb10: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
bb20: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
bb30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bb40: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
bb50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
bb60: 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
bb70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 50 65 72  {.      int bPer
bb80: 73 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29 70 41  sist = *(int*)pA
bb90: 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 62 50  rg;.      if( bP
bba0: 65 72 73 69 73 74 3c 30 20 29 7b 0a 20 20 20 20  ersist<0 ){.    
bbb0: 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
bbc0: 3d 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73  = pFile->bPersis
bbd0: 74 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tWal;.      }els
bbe0: 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  e{.        pFile
bbf0: 2d 3e 62 50 65 72 73 69 73 74 57 61 6c 20 3d 20  ->bPersistWal = 
bc00: 62 50 65 72 73 69 73 74 21 3d 30 3b 0a 20 20 20  bPersist!=0;.   
bc10: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
bc20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
bc30: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
bc40: 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43 5f 4f 4d  TE_FCNTL_SYNC_OM
bc50: 49 54 54 45 44 3a 20 7b 0a 20 20 20 20 20 20 72  ITTED: {.      r
bc60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bc70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bc80: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
bc90: 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
bca0: 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
bcb0: 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
bcc0: 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
bcd0: 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72        win32Ioerr
bce0: 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
bcf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bd00: 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49     a[0] = win32I
bd10: 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
bd20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
bd30: 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
bd40: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
bd50: 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
bd60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bd70: 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[1] = win32Ioe
bd80: 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
bd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
bda0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
bdb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bdc0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
bdd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
bde0: 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
bdf0: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
be00: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
be10: 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
be20: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
be30: 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
be40: 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
be50: 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
be60: 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
be70: 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
be80: 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
be90: 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
bea0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
beb0: 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
bec0: 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
bed0: 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
bee0: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
bef0: 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
bf00: 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
bf10: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
bf20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
bf30: 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
bf40: 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
bf50: 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
bf60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf70: 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71  winSectorSize(sq
bf80: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
bf90: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
bfa0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
bfb0: 74 29 28 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  t)(((winFile*)id
bfc0: 29 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  )->sectorSize);.
bfd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
bfe0: 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
bff0: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
c000: 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
c010: 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
c020: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
c030: 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
c040: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
c050: 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (id);.  return S
c060: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
c070: 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
c080: 4e 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  N;.}..#ifndef SQ
c090: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
c0a0: 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69  * .** Windows wi
c0b0: 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20  ll only let you 
c0c0: 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77  create file view
c0d0: 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20   mappings.** on 
c0e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
c0f0: 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e  granularity boun
c100: 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e  daries..** Durin
c110: 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  g sqlite3_os_ini
c120: 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53  t() we do a GetS
c130: 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74  ystemInfo().** t
c140: 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c  o get the granul
c150: 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53  arity size..*/.S
c160: 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
c170: 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  sInfo;../*.** He
c180: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
c190: 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
c1a0: 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
c1b0: 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
c1c0: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
c1d0: 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
c1e0: 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f   the winLockInfo
c1f0: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
c200: 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20   .** this file, 
c210: 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
c220: 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
c230: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
c240: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
c250: 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
c260: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
c270: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
c280: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
c290: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
c2a0: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
c2b0: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
c2c0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
c2d0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
c2e0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
c2f0: 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
c300: 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
c310: 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
c320: 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69  eld() );.**   wi
c330: 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
c340: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c350: 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
c360: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
c370: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
c380: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
c390: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
c3a0: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
c3b0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
c3c0: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
c3d0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
c3e0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
c3f0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
c400: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
c410: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
c420: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
c430: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
c440: 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
c450: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
c460: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
c470: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
c480: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
c490: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
c4a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
c4b0: 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
c4c0: 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
c4d0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
c4e0: 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
c4f0: 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
c500: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
c510: 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
c520: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
c530: 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
c540: 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
c550: 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
c560: 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
c570: 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
c580: 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
c590: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
c5a0: 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
c5b0: 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
c5c0: 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
c5d0: 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
c5e0: 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
c5f0: 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
c600: 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
c610: 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
c620: 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
c630: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
c640: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
c650: 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
c660: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
c670: 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
c680: 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
c690: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
c6a0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
c6b0: 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
c6c0: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
c6d0: 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
c6e0: 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
c6f0: 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
c700: 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
c710: 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
c720: 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
c730: 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
c740: 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
c750: 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
c760: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
c770: 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
c780: 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
c790: 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
c7a0: 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
c7b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
c7c0: 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
c7d0: 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
c7e0: 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
c7f0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
c800: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
c810: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
c820: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
c830: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
c840: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
c850: 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
c860: 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c880: 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
c890: 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
c8a0: 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c8c0: 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
c8d0: 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
c8e0: 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
c8f0: 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c910: 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
c920: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
c930: 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
c940: 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
c950: 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
c960: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
c970: 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
c980: 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
c990: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
c9a0: 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c9c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
c9d0: 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
c9e0: 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
c9f0: 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ca10: 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
ca20: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
ca30: 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
ca40: 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
ca50: 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
ca60: 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
ca70: 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
ca80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ca90: 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
caa0: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
cab0: 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
cac0: 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
cad0: 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
cae0: 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
caf0: 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
cb00: 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
cb10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
cb20: 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
cb30: 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
cb40: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
cb50: 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
cb60: 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
cb70: 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
cb80: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
cb90: 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
cba0: 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
cbb0: 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
cbc0: 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
cbd0: 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
cbe0: 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
cbf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
cc00: 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
cc10: 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
cc20: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
cc30: 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
cc40: 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
cc50: 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
cc60: 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
cc70: 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
cc80: 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
cc90: 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
cca0: 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
ccb0: 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
ccc0: 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
ccd0: 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
cce0: 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
ccf0: 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
cd00: 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
cd10: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
cd20: 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
cd30: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
cd40: 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
cd50: 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
cd60: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
cd70: 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
cd80: 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
cd90: 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
cda0: 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
cdc0: 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
cdd0: 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
cde0: 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
cdf0: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
ce00: 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
ce10: 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
ce20: 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
ce50: 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
ce60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ce70: 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
cea0: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
ceb0: 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
cec0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
ced0: 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
cee0: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
cef0: 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
cf00: 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
cf10: 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
cf20: 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
cf30: 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
cf40: 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
cf50: 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
cf60: 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
cf70: 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
cf80: 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
cf90: 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
cfa0: 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
cfb0: 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
cfc0: 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
cfd0: 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
cfe0: 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
cff0: 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
d000: 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
d010: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
d020: 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
d030: 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
d040: 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
d050: 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
d060: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
d070: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
d080: 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
d090: 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
d0a0: 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
d0b0: 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
d0c0: 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
d0d0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
d0e0: 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
d0f0: 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
d100: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
d110: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d120: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
d130: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
d140: 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c  ck */.){.  OVERL
d150: 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57  APPED ovlp;.  DW
d160: 4f 52 44 20 64 77 46 6c 61 67 73 3b 0a 20 20 69  ORD dwFlags;.  i
d170: 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
d180: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
d190: 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e  ode form Lock/Un
d1a0: 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a  lockFileEx() */.
d1b0: 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
d1c0: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  the winShmNode o
d1d0: 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
d1e0: 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
d1f0: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
d200: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d210: 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20  d(pFile->mutex) 
d220: 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d  || pFile->nRef==
d230: 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  0 );..  /* Initi
d240: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
d250: 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
d260: 20 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b    dwFlags = LOCK
d270: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
d280: 41 54 45 4c 59 3b 0a 20 20 69 66 28 20 6c 6f 63  ATELY;.  if( loc
d290: 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52  kType == _SHM_WR
d2a0: 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d  LCK ) dwFlags |=
d2b0: 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
d2c0: 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20 6d 65 6d  IVE_LOCK;..  mem
d2d0: 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69  set(&ovlp, 0, si
d2e0: 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
d2f0: 29 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  );.  ovlp.Offset
d300: 20 3d 20 6f 66 73 74 3b 0a 0a 20 20 2f 2a 20 52   = ofst;..  /* R
d310: 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74  elease/Acquire t
d320: 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
d330: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  lock */.  if( lo
d340: 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
d350: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 55  CK ){.    rc = U
d360: 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c  nlockFileEx(pFil
d370: 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30 2c 20 6e  e->hFile.h, 0, n
d380: 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  Byte, 0, &ovlp);
d390: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d3a0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46   = LockFileEx(pF
d3b0: 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77  ile->hFile.h, dw
d3c0: 46 6c 61 67 73 2c 20 30 2c 20 6e 42 79 74 65 2c  Flags, 0, nByte,
d3d0: 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 0a   0, &ovlp);.  }.
d3e0: 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20    .  if( rc!= 0 
d3f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d400: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
d410: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d420: 72 72 6e 6f 20 3d 20 20 47 65 74 4c 61 73 74 45  rrno =  GetLastE
d430: 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
d440: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
d450: 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
d460: 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73  HM-LOCK %d %s %s
d470: 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20   0x%08lx\n", .  
d480: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
d490: 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
d4a0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
d4b0: 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
d4c0: 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ed",.           
d4d0: 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
d4e0: 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69  NLCK ? "UnlockFi
d4f0: 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c  leEx" : "LockFil
d500: 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eEx",.          
d510: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d520: 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  o));..  return r
d530: 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
d540: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
d550: 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
d560: 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
d570: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
d580: 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
d590: 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
d5a0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
d5b0: 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
d5c0: 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
d5d0: 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
d5e0: 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
d5f0: 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
d600: 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
d610: 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
d620: 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
d630: 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
d640: 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
d650: 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
d660: 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
d670: 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
d680: 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
d690: 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
d6a0: 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
d6b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d6c0: 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
d6d0: 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
d6e0: 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
d6f0: 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52  de *p;.  BOOL bR
d700: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  c;.  assert( win
d710: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
d720: 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d  ;.  pp = &winShm
d730: 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  NodeList;.  whil
d740: 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20  e( (p = *pp)!=0 
d750: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  ){.    if( p->nR
d760: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
d770: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
d780: 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
d790: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
d7a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66  >mutex);.      f
d7b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
d7c0: 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
d7d0: 20 20 20 20 62 52 63 20 3d 20 55 6e 6d 61 70 56      bRc = UnmapV
d7e0: 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65  iewOfFile(p->aRe
d7f0: 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20  gion[i].pMap);. 
d800: 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
d810: 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25  "SHM-PURGE pid-%
d820: 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25  d unmap region=%
d830: 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
d840: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 47            (int)G
d850: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
d860: 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20  Id(), i,.       
d870: 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20            bRc ? 
d880: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
d890: 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
d8a0: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e   CloseHandle(p->
d8b0: 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
d8c0: 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
d8d0: 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69  E(("SHM-PURGE pi
d8e0: 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67 69 6f  d-%d close regio
d8f0: 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  n=%d %s\n",.    
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
d910: 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  t)GetCurrentProc
d920: 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20  essId(), i,.    
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63               bRc
d940: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
d950: 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
d960: 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65      if( p->hFile
d970: 2e 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41  .h != INVALID_HA
d980: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
d990: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
d9a0: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
d9b0: 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
d9c0: 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
d9d0: 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
d9e0: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
d9f0: 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
da00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
da10: 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
da20: 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
da30: 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
da40: 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65  .        winDele
da50: 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c  te(pVfs, p->zFil
da60: 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  ename, 0);.     
da70: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
da80: 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
da90: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
daa0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
dab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
dac0: 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  >aRegion);.     
dad0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
dae0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
daf0: 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78     pp = &p->pNex
db00: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
db10: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
db20: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
db30: 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
db40: 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
db50: 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  pDbFd..**.** Whe
db60: 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
db70: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
db80: 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
db90: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
dba0: 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
dbb0: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
dbc0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
dbd0: 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
dbe0: 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
dbf0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
dc00: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
dc10: 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
dc20: 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
dc30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
dc40: 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
dc50: 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44  mory(winFile *pD
dc60: 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77  bFd){.  struct w
dc70: 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
dc80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
dc90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
dca0: 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
dcb0: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
dcc0: 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20   *pShmNode = 0; 
dcd0: 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
dce0: 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
dcf0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
dd20: 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72  lt code */.  str
dd30: 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
dd40: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
dd50: 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
dd60: 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ed winShmNode */
dd70: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
dda0: 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20   zName in bytes 
ddb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
ddc0: 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20  bFd->pShm==0 ); 
ddd0: 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f     /* Not previo
dde0: 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a  usly opened */..
ddf0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
de00: 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
de10: 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65  sqlite3_shm obje
de20: 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c  ct.  Also specul
de30: 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c  atively.  ** all
de40: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
de50: 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65  a new winShmNode
de60: 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20   and filename.. 
de70: 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
de80: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
de90: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
dea0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
deb0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
dec0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
ded0: 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  *p));.  nName = 
dee0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
def0: 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
df00: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
df10: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
df20: 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
df30: 65 20 2b 20 31 35 20 29 3b 0a 20 20 69 66 28 20  e + 15 );.  if( 
df40: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
df50: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
df60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
df70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
df80: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
df90: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
dfa0: 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
dfb0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
dfc0: 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
dfd0: 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
dfe0: 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
dff0: 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
e000: 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
e010: 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
e020: 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
e030: 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
e040: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
e050: 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
e060: 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
e070: 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
e080: 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
e090: 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
e0a0: 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
e0b0: 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
e0c0: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
e0d0: 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
e0e0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
e0f0: 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
e100: 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
e110: 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
e120: 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
e130: 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
e140: 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
e150: 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
e160: 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
e170: 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
e180: 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
e190: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
e1a0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
e1b0: 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
e1c0: 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
e1d0: 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
e1e0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
e1f0: 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
e200: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
e210: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
e220: 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
e230: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
e240: 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
e250: 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
e260: 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
e270: 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
e280: 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
e290: 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
e2a0: 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
e2b0: 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
e2c0: 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
e2d0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
e2e0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
e2f0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
e300: 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
e310: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
e320: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e330: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
e340: 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
e350: 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
e360: 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
e370: 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
e380: 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
e390: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
e3a0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e3b0: 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
e3c0: 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  8) */.          
e3d0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
e3e0: 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
e3f0: 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65  >hFile,  /* File
e400: 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
e430: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
e440: 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
e450: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f  E_OPEN_CREATE, /
e460: 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  * Mode flags */.
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
e490: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
e4a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e4b0: 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
e4c0: 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
e4d0: 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
e4e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
e4f0: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
e500: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
e510: 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
e520: 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20  itch..    ** If 
e530: 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
e540: 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
e550: 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20  ength. .    */. 
e560: 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73     if( winShmSys
e570: 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
e580: 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  , _SHM_WRLCK, WI
e590: 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
e5a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e5b0: 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
e5c0: 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
e5d0: 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
e5e0: 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
e5f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e600: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e610: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
e620: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
e630: 4e 2c 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c  N, "winOpenShm",
e640: 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
e650: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e660: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e670: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
e680: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
e690: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
e6a0: 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
e6b0: 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
e6c0: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
e6d0: 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
e6e0: 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
e6f0: 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
e700: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
e710: 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
e720: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
e730: 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
e740: 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
e750: 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
e760: 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
e770: 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
e780: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
e790: 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
e7a0: 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
e7b0: 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
e7c0: 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
e7d0: 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
e7e0: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
e7f0: 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
e800: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
e810: 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
e820: 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
e830: 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
e840: 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
e850: 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
e860: 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
e870: 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
e880: 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
e890: 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
e8a0: 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
e8b0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
e8c0: 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
e8d0: 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
e8e0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
e8f0: 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
e900: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
e910: 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
e920: 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
e930: 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
e940: 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
e950: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
e960: 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
e970: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
e980: 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
e990: 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
e9a0: 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
e9b0: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
e9c0: 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
e9d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
e9e0: 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
e9f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ea00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
ea10: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
ea20: 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
ea30: 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
ea40: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
ea50: 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
ea60: 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
ea70: 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
ea80: 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
ea90: 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
eaa0: 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
eab0: 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
eac0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
ead0: 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
eae0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
eaf0: 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
eb00: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
eb10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
eb20: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
eb30: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
eb40: 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
eb50: 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
eb60: 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
eb70: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
eb80: 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
eb90: 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
eba0: 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
ebb0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
ebc0: 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
ebd0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
ebe0: 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
ebf0: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
ec00: 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
ec10: 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
ec20: 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
ec30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
ec40: 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
ec50: 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
ec60: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
ec70: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
ec80: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
ec90: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
eca0: 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
ecb0: 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
ecc0: 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
ecd0: 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
ece0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
ecf0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
ed00: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
ed10: 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
ed20: 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
ed30: 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
ed40: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
ed50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ed60: 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
ed70: 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
ed80: 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
ed90: 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
eda0: 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
edb0: 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
edc0: 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
edd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ede0: 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
edf0: 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
ee00: 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
ee10: 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
ee20: 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
ee30: 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
ee40: 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
ee50: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
ee60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
ee70: 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
ee80: 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
ee90: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
eea0: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
eeb0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
eec0: 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
eed0: 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
eee0: 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
eef0: 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
ef00: 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
ef10: 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
ef20: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
ef30: 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
ef40: 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
ef50: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
ef60: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
ef70: 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
ef80: 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
ef90: 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
efa0: 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
efb0: 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
efc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
efd0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
efe0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
eff0: 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
f000: 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
f010: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
f020: 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
f030: 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
f040: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
f050: 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
f060: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
f070: 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f090: 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
f0a0: 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
f0b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
f0e0: 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
f0f0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
f100: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
f110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
f120: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
f130: 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
f140: 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
f150: 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
f160: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
f170: 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
f180: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
f190: 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
f1a0: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
f1b0: 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
f1c0: 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
f1d0: 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
f1e0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
f210: 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
f220: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
f230: 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
f240: 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
f250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
f280: 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
f2b0: 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
f2c0: 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
f2d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
f2e0: 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
f2f0: 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
f300: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
f310: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
f320: 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
f330: 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
f340: 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
f350: 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
f360: 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
f370: 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
f380: 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
f390: 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
f3a0: 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
f3b0: 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
f3c0: 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
f3d0: 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
f3e0: 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
f3f0: 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
f400: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
f410: 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
f420: 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
f430: 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
f440: 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
f450: 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
f460: 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
f470: 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
f480: 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
f490: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
f4a0: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
f4b0: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
f4c0: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
f4d0: 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
f4e0: 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
f4f0: 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
f500: 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
f510: 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
f520: 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
f530: 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
f540: 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
f550: 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
f560: 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
f570: 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
f580: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
f590: 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
f5a0: 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
f5b0: 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
f5c0: 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
f5d0: 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
f5e0: 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
f5f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
f600: 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
f610: 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
f620: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
f630: 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
f640: 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
f650: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
f660: 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
f670: 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
f680: 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
f690: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f6a0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
f6b0: 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
f6c0: 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
f6d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f6e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
f6f0: 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
f700: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
f710: 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
f720: 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
f730: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
f740: 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
f750: 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
f760: 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
f770: 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
f780: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
f790: 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
f7a0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
f7b0: 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
f7c0: 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
f7d0: 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
f7e0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
f7f0: 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
f800: 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
f810: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
f820: 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
f830: 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
f840: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
f850: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
f860: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
f870: 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
f880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
f890: 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
f8a0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
f8b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
f8c0: 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
f8d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f8e0: 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
f8f0: 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
f900: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
f910: 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
f920: 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
f930: 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
f940: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f950: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f960: 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
f970: 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
f980: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
f990: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
f9a0: 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
f9b0: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
f9c0: 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
f9d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
f9e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f9f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
fa00: 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
fa10: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
fa20: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
fa30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fa40: 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
fa50: 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
fa60: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
fa70: 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
fa80: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
fa90: 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
faa0: 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
fab0: 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
fac0: 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
fad0: 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
fae0: 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
faf0: 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
fb00: 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
fb10: 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
fb20: 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
fb30: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
fb40: 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
fb50: 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
fb60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
fb70: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
fb80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fb90: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
fba0: 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
fbb0: 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
fbc0: 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
fbd0: 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
fbe0: 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
fbf0: 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
fc00: 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
fc10: 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
fc20: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
fc30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fc40: 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
fc50: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
fc60: 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
fc70: 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
fc80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
fc90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
fcb0: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
fcc0: 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
fcd0: 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
fce0: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
fcf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
fd00: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fd10: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
fd20: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
fd30: 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
fd40: 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
fd50: 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20  ,%03x %s\n",.   
fd60: 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28          p->id, (
fd70: 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
fd80: 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68  ocessId(), p->sh
fd90: 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
fda0: 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
fdb0: 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20    rc ? "failed" 
fdc0: 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
fdd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fde0: 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
fdf0: 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
fe00: 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
fe10: 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
fe20: 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
fe30: 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
fe40: 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
fe50: 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
fe60: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
fe70: 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
fe80: 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
fe90: 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
fea0: 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
feb0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
fec0: 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
fed0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
fee0: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
fef0: 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
ff00: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
ff10: 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
ff20: 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
ff30: 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
ff40: 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
ff50: 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
ff60: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
ff70: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
ff80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
ff90: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
ffa0: 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
ffb0: 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
ffc0: 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
ffd0: 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
ffe0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
fff0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10000 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
10010 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
10020 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
10030 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
10040 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
10050 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
10060 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
10070 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
10080 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
10090 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
100a0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
100b0 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
100c0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
100d0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
100e0 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
100f0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
10100 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
10110 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
10120 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
10130 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
10140 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
10150 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
10160 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
10170 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
10180 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
10190 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
101a0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
101b0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
101c0 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
101d0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
101e0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
101f0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
10200 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
10210 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
10220 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
10230 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
10240 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
10250 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
10260 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
10270 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
10280 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
10290 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
102a0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
102b0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
102c0 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
102d0 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
102e0 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
102f0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
10300 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
10310 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
10320 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
10330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10340 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
10350 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10370 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
10380 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
10390 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
103c0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
103d0 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103f0 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
10400 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
10410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10420 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
10430 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
10440 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
10450 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10470 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
10480 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
10490 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
104a0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
104b0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
104c0 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
104d0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
104e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
104f0 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
10500 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
10510 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
10520 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
10530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
10540 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
10550 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
10560 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
10570 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
10580 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10590 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
105a0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
105b0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
105c0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
105d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
105e0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
105f0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
10600 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
10610 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
10620 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
10630 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
10640 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
10650 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
10660 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
10670 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
10680 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
10690 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
106a0 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
106b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
106c0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
106d0 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
106e0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
106f0 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
10700 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
10710 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
10720 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
10730 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
10740 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
10750 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
10760 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
10770 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
10780 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
10790 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
107a0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
107b0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
107c0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
107d0 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
107e0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
107f0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
10800 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
10810 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
10820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10830 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
10840 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
10850 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22  IOERR_SHMSIZE, "
10860 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
10870 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
10880 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
10890 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
108a0 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
108b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
108c0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
108d0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
108e0 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
108f0 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
10900 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
10910 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
10920 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
10930 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
10940 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
10950 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
10960 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
10970 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
10980 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
10990 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
109a0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
109b0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
109c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
109d0 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
109e0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
109f0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
10a00 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
10a10 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
10a20 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
10a30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10a40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10a50 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
10a60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
10a70 5f 53 48 4d 53 49 5a 45 2c 20 22 77 69 6e 53 68  _SHMSIZE, "winSh
10a80 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap2", pDbFd->z
10a90 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67  Path);.        g
10aa0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
10ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10ac0 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
10ad0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
10ae0 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
10af0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
10b00 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
10b10 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74   apNew = (struct
10b20 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c   ShmRegion *)sql
10b30 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
10b40 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
10b50 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  aRegion, (iRegio
10b60 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65  n+1)*sizeof(apNe
10b70 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20  w[0]).    );.   
10b80 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
10b90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10ba0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
10bb0 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
10bc0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
10bd0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
10be0 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20  n = apNew;..    
10bf0 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
10c00 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
10c10 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c  n ){.      HANDL
10c20 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
10c30 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d         /* file-m
10c40 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f  apping handle */
10c50 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  .      void *pMa
10c60 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
10c70 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d     /* Mapped mem
10c80 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ory region */.  
10c90 20 20 20 0a 20 20 20 20 20 20 68 4d 61 70 20 3d     .      hMap =
10ca0 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
10cb0 6e 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  ng(pShmNode->hFi
10cc0 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
10cd0 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
10ce0 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
10cf0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20   NULL.      );. 
10d00 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
10d10 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63 72  HM-MAP pid-%d cr
10d20 65 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e  eate region=%d n
10d30 62 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  byte=%d %s\n",. 
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
10d50 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  nt)GetCurrentPro
10d60 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
10d70 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79  de->nRegion, nBy
10d80 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
10d90 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     hMap ? "ok" :
10da0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
10db0 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
10dc0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
10dd0 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  et = pShmNode->n
10de0 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
10df0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
10e00 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
10e10 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
10e20 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
10e30 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 20 20  nularity;.      
10e40 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69 65 77    pMap = MapView
10e50 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c  OfFile(hMap, FIL
10e60 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
10e70 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
10e80 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66           0, iOff
10e90 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
10ea0 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
10eb0 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
10ec0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 4f      );.        O
10ed0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
10ee0 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69   pid-%d map regi
10ef0 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20  on=%d offset=%d 
10f00 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  size=%d %s\n",. 
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50  (int)GetCurrentP
10f30 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
10f40 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
10f50 4f 66 66 73 65 74 2c 20 73 7a 52 65 67 69 6f 6e  Offset, szRegion
10f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10f70 20 20 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     pMap ? "ok" :
10f80 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
10f90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
10fa0 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
10fb0 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
10fc0 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
10fd0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63  or();.        rc
10fe0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
10ff0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
11000 41 50 2c 20 22 77 69 6e 53 68 6d 4d 61 70 33 22  AP, "winShmMap3"
11010 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
11020 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61  .        if( hMa
11030 70 20 29 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28  p ) CloseHandle(
11040 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67  hMap);.        g
11050 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
11060 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11070 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
11080 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
11090 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70  ion].pMap = pMap
110a0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
110b0 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
110c0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61  de->nRegion].hMa
110d0 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20  p = hMap;.      
110e0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
110f0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
11100 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
11110 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
11120 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
11130 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
11140 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  = iRegion*szRegi
11150 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  on;.    int iOff
11160 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
11170 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
11180 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
11190 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61  ularity;.    cha
111a0 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70  r *p = (char *)p
111b0 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
111c0 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a  [iRegion].pMap;.
111d0 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20      *pp = (void 
111e0 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66  *)&p[iOffsetShif
111f0 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
11200 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
11210 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11220 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
11230 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
11240 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
11250 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20  fine winShmMap  
11260 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
11270 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  nShmLock    0.# 
11280 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72  define winShmBar
11290 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
112a0 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  winShmUnmap   0.
112b0 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
112c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
112d0 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  L */../*.** Here
112e0 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
112f0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
11300 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
11310 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
11320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11330 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
11340 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
11350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11360 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113b0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
113c0 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
113d0 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
113e0 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
113f0 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
11400 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
11410 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
11420 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
11430 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
11440 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20  thod = {.  2,   
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
11470 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
11480 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
11490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
114a0 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
114b0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
114c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
114d0 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
114e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
114f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
11500 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
11510 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
11520 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
11530 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
11540 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
11550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
11560 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
11570 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
11580 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
11590 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
115a0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
115b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
115c0 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
115d0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
115e0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
115f0 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
11600 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
11610 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
11620 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
11630 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
11640 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
11650 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
11660 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
11670 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
11680 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
11690 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
116a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
116b0 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
116c0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
116d0 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
116e0 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
116f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
11700 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
11710 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
11720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
11730 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
11740 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
11750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11760 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
11770 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20  winShmUnmap     
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
117a0 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
117b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
11810 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
11820 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11840 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
11850 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
11860 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
11870 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
11880 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
11890 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
118a0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
118b0 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f  -8 filename into
118c0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74   whatever form t
118d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
118e0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
118f0 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65  m wants filename
11900 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  s in.  Space to 
11910 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a  hold the result.
11920 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
11930 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
11940 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
11950 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
11960 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
11970 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74  ic void *convert
11980 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
11990 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
119a0 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  me){.  void *zCo
119b0 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
119c0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
119d0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74   zConverted = ut
119e0 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
119f0 65 6e 61 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54 28  ename);./* isNT(
11a00 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
11a10 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
11a20 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
11a30 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
11a40 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
11a50 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
11a60 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
11a70 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
11a80 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46  _utf8_to_mbcs(zF
11a90 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
11aa0 0a 20 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65 72  .  }.  /* caller
11ab0 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74   will handle out
11ac0 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
11ad0 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65  return zConverte
11ae0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  d;.}../*.** Crea
11af0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
11b00 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
11b10 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
11b20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a  big enough to.**
11b30 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d   hold at pVfs->m
11b40 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63  xPathname charac
11b50 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
11b60 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  int getTempname(
11b70 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
11b80 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
11b90 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
11ba0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
11bb0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
11bc0 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
11bd0 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
11be0 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
11bf0 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20  9";.  size_t i, 
11c00 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50  j;.  char zTempP
11c10 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b  ath[MAX_PATH+1];
11c20 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
11c30 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
11c40 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
11c50 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
11c60 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
11c70 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
11c80 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
11c90 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
11ca0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
11cb0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
11cc0 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
11cd0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
11ce0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
11cf0 52 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  R );..  if( sqli
11d00 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
11d10 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
11d20 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
11d30 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
11d40 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  h, "%s", sqlite3
11d50 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
11d60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
11d70 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
11d80 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43   *zMulti;.    WC
11d90 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41  HAR zWidePath[MA
11da0 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74  X_PATH];.    Get
11db0 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41  TempPathW(MAX_PA
11dc0 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68  TH-30, zWidePath
11dd0 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20  );.    zMulti = 
11de0 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  unicodeToUtf8(zW
11df0 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
11e00 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
11e10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11e20 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
11e30 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
11e40 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
11e50 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
11e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
11e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11e80 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73 4e  EM;.    }./* isN
11e90 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
11ea0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
11eb0 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
11ec0 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
11ed0 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53  .** Since the AS
11ee0 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  CII version of t
11ef0 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
11f00 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
11f10 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
11f20 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
11f30 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
11f40 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
11f50 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
11f60 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
11f70 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
11f80 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20  zUtf8;.    char 
11f90 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50 41  zMbcsPath[MAX_PA
11fa0 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d 70  TH];.    GetTemp
11fb0 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33  PathA(MAX_PATH-3
11fc0 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  0, zMbcsPath);. 
11fd0 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74     zUtf8 = sqlit
11fe0 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
11ff0 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29  _utf8(zMbcsPath)
12000 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
12010 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12020 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
12030 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
12040 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
12050 20 20 20 20 20 20 66 72 65 65 28 7a 55 74 66 38        free(zUtf8
12060 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
12070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12080 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
12090 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
120a0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
120b0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
120c0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
120d0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
120e0 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
120f0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
12100 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12110 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
12120 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12130 54 65 6d 70 50 61 74 68 29 20 2b 20 73 71 6c 69  TempPath) + sqli
12140 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49  te3Strlen30(SQLI
12150 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
12160 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 6e 42  FIX) + 17) >= nB
12170 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  uf ){.    return
12180 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12190 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69   }..  for(i=sqli
121a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
121b0 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a  pPath); i>0 && z
121c0 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
121d0 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
121e0 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
121f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
12200 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
12210 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f,.             
12220 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49        "%s\\"SQLI
12230 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
12240 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b  FIX, zTempPath);
12250 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74  .  j = sqlite3St
12260 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
12270 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
12280 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
12290 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ;.  for(i=0; i<1
122a0 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
122b0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
122c0 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
122d0 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
122e0 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
122f0 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a  s)-1) ];.  }.  z
12300 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 0a 20 20 4f  Buf[j] = 0;..  O
12310 53 54 52 41 43 45 28 28 22 54 45 4d 50 20 46 49  STRACE(("TEMP FI
12320 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a  LENAME: %s\n", z
12330 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
12340 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
12350 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
12360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12370 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
12380 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
12390 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
123a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
123b0 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
123c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
123d0 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
123e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
123f0 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
12400 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
12410 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
12420 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12440 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
12450 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
12460 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
12470 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
12480 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
12490 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
124a0 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
124b0 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
124c0 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
124d0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
124e0 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
124f0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
12500 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
12510 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
12520 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
12530 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
12540 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
12550 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
12560 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
12570 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
12580 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
12590 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
125a0 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
125b0 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
125c0 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
125d0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
125e0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
125f0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
12600 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
12610 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
12620 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
12630 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
12640 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
12650 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
12660 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
12670 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
12680 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
12690 41 54 48 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 42  ATH+1];     /* B
126a0 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72  uffer used to cr
126b0 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61  eate temp filena
126c0 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  me */..  int rc 
126d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
126e0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
126f0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
12700 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
12710 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
12720 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
12730 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
12740 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
12750 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
12760 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
12770 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
12780 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
12790 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
127a0 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
127b0 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
127c0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
127d0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
127e0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
127f0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
12800 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
12810 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
12820 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c  .  int isReadonl
12830 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  y   = (flags & S
12840 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
12850 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  NLY);.#endif.  i
12860 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
12870 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
12880 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12890 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
128a0 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  UG.  int isOpenJ
128b0 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
128c0 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
128d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
128e0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
128f0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
12900 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
12910 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  IN_JOURNAL .    
12920 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
12930 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b  E_OPEN_WAL.  ));
12940 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68  .#endif..  /* Ch
12950 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
12960 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
12970 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
12980 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
12990 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
129a0 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
129b0 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
129c0 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
129d0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
129e0 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
129f0 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
12a00 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
12a10 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
12a20 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
12a30 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
12a40 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
12a50 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
12a60 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
12a70 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
12a80 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
12a90 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
12aa0 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
12ab0 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
12ac0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
12ad0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
12ae0 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
12af0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
12b00 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
12b10 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
12b20 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
12b30 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
12b40 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
12b50 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
12b60 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
12b70 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
12b80 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
12b90 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
12ba0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
12bb0 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
12bc0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
12bd0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
12be0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
12bf0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
12c00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
12c10 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
12c20 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
12c30 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
12c40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
12c50 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
12c60 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
12c70 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
12c80 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
12c90 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
12ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
12cb0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
12cc0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
12cd0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
12ce0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
12cf0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
12d00 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
12d10 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
12d20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
12d30 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
12d40 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
12d50 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
12d60 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
12d70 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
12d80 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
12d90 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
12da0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
12db0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
12dc0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
12dd0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
12de0 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
12df0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
12e00 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
12e10 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
12e20 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
12e30 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
12e40 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
12e50 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73  _WAL.  );..  ass
12e60 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
12e70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12e80 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65  (pVfs);..  pFile
12e90 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
12ea0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f  NDLE_VALUE;..  /
12eb0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
12ec0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
12ed0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
12ee0 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20  L, generate a . 
12ef0 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
12f00 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a  le name to use .
12f10 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66    */.  if( !zUtf
12f20 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  8Name ){.    ass
12f30 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
12f40 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b  !isOpenJournal);
12f50 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d  .    rc = getTem
12f60 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 31  pname(MAX_PATH+1
12f70 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
12f80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12f90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
12fa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12fb0 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
12fc0 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
12fd0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
12fe0 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
12ff0 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
13000 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
13010 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
13020 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
13030 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
13040 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
13050 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
13060 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61    }..  if( isRea
13070 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77  dWrite ){.    dw
13080 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
13090 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
130a0 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20  ENERIC_WRITE;.  
130b0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73  }else{.    dwDes
130c0 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
130d0 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  ERIC_READ;.  }..
130e0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    /* SQLITE_OPEN
130f0 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73  _EXCLUSIVE is us
13100 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
13110 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20  that a new file 
13120 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  is .  ** created
13130 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74  . SQLite doesn't
13140 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63   use it to indic
13150 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61  ate "exclusive a
13160 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20  ccess" .  ** as 
13170 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e  it is usually un
13180 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20  derstood..  */. 
13190 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
131a0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
131b0 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
131c0 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
131d0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
131e0 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
131f0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
13200 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
13210 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
13220 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
13230 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
13240 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20   isCreate ){.   
13250 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e   /* Open existin
13260 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74  g file, or creat
13270 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  e if it doesn't 
13280 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43  exist */.    dwC
13290 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
132a0 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53  on = OPEN_ALWAYS
132b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
132c0 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20  * Opens a file, 
132d0 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74  only if it exist
132e0 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
132f0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
13300 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b  = OPEN_EXISTING;
13310 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d  .  }..  dwShareM
13320 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45  ode = FILE_SHARE
13330 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
13340 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28  RE_WRITE;..  if(
13350 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66   isDelete ){.#if
13360 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13370 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
13380 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
13390 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
133a0 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20  N;.    isTemp = 
133b0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46  1;.#else.    dwF
133c0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
133d0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
133e0 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20  TE_TEMPORARY.   
133f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13400 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
13410 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
13420 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEN.            
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
13450 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
13460 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
13470 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
13480 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
13490 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c  ATTRIBUTE_NORMAL
134a0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72  ;.  }.  /* Repor
134b0 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ts from the inte
134c0 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65  rnet are that pe
134d0 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77  rformance is alw
134e0 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20  ays.  ** better 
134f0 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  if FILE_FLAG_RAN
13500 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73  DOM_ACCESS is us
13510 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39  ed.  Ticket #269
13520 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  9. */.#if SQLITE
13530 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c  _OS_WINCE.  dwFl
13540 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
13550 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   |= FILE_FLAG_RA
13560 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e  NDOM_ACCESS;.#en
13570 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28  dif..  if( isNT(
13580 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
13590 28 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57  (h = CreateFileW
135a0 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
135b0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
135e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
13600 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
13610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13620 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
13630 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
13640 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
13670 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
136a0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
136b0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
136d0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 29 20 29  tryIoerr(&cnt) )
136e0 7b 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  {}./* isNT() is 
136f0 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
13700 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
13710 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
13720 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
13730 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
13740 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
13750 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
13760 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
13770 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
13780 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
13790 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
137a0 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
137b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
137c0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
137d0 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 43     while( (h = C
137e0 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61 72  reateFileA((char
137f0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13810 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
13820 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
13850 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  de, NULL,.      
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
13880 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
138b0 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
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 20 20 4e 55 4c 4c 29             NULL)
138e0 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
138f0 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13910 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72         retryIoer
13920 72 28 26 63 6e 74 29 20 29 7b 7d 0a 23 65 6e 64  r(&cnt) ){}.#end
13930 69 66 0a 20 20 7d 0a 0a 20 20 6c 6f 67 49 6f 65  if.  }..  logIoe
13940 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52  rr(cnt);..  OSTR
13950 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
13960 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20   0x%lx %s\n", . 
13970 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e 61            h, zNa
13980 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63  me, dwDesiredAcc
13990 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ess, .          
139a0 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
139b0 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69 6c  LE_VALUE ? "fail
139c0 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20  ed" : "ok"));.. 
139d0 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
139e0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
139f0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13a00 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
13a10 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
13a20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
13a30 4e 54 4f 50 45 4e 2c 20 22 77 69 6e 4f 70 65 6e  NTOPEN, "winOpen
13a40 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
13a50 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
13a60 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52  ed);.    if( isR
13a70 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
13a80 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e    return winOpen
13a90 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64  (pVfs, zName, id
13aa0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13ab0 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f  ((flags|SQLITE_O
13ac0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e 28  PEN_READONLY)&~(
13ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
13ae0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
13af0 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75 74  EADWRITE)), pOut
13b00 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
13b10 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
13b20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
13b30 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
13b40 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73  .  if( pOutFlags
13b50 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65   ){.    if( isRe
13b60 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
13b70 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51   *pOutFlags = SQ
13b80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13b90 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
13ba0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
13bb0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
13bc0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
13bd0 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   }..  memset(pFi
13be0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
13bf0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
13c00 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
13c10 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
13c20 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65  ->h = h;.  pFile
13c30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
13c40 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
13c50 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
13c60 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b  pFile->pShm = 0;
13c70 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
13c80 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c 65  = zName;.  pFile
13c90 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 67  ->sectorSize = g
13ca0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 56 66  etSectorSize(pVf
13cb0 73 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 0a  s, zUtf8Name);..
13cc0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13cd0 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64  NCE.  if( isRead
13ce0 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
13cf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
13d00 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 21 77  _DB.       && !w
13d10 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a  inceCreateLock(z
13d20 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29  Name, pFile).  )
13d30 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c  {.    CloseHandl
13d40 65 28 68 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  e(h);.    free(z
13d50 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
13d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
13d70 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d  NTOPEN_BKPT;.  }
13d80 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
13d90 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
13da0 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
13db0 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
13dc0 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
13dd0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
13de0 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75  ;.  }..  OpenCou
13df0 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
13e00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13e10 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64  Delete the named
13e20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   file..**.** Not
13e30 65 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64  e that windows d
13e40 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
13e50 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
13e60 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
13e70 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20  .** process has 
13e80 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69  it open.  Someti
13e90 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e  mes a virus scan
13ea0 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20  ner or indexing 
13eb0 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20  program.** will 
13ec0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
13ed0 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65  ile shortly afte
13ee0 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  r it is created 
13ef0 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a  in order to do.*
13f00 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f  * whatever it do
13f10 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20  es.  While this 
13f20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
13f30 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20   holding the.** 
13f40 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69  file open, we wi
13f50 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ll be unable to 
13f60 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77  delete it.  To w
13f70 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a  ork around this.
13f80 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64  ** problem, we d
13f90 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65  elay 100 millise
13fa0 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f  conds and try to
13fb0 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20   delete again.  
13fc0 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45  Up.** to MX_DELE
13fd0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65  TION_ATTEMPTs de
13fe0 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  letion attempts 
13ff0 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67  are run before g
14000 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20  iving.** up and 
14010 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
14020 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
14030 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73  t winDelete(.  s
14040 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
14050 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
14060 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
14070 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
14080 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
14090 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
140a0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
140b0 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20  int syncDir     
140c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
140d0 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
140e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74   */.){.  int cnt
140f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
14100 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
14110 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
14120 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
14130 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
14140 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69  (syncDir);..  Si
14150 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
14160 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14170 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f  R_DELETE);.  zCo
14180 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
14190 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
141a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
141b0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
141c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
141d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
141e0 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
141f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77 68    rc = 1;.    wh
14200 69 6c 65 28 20 47 65 74 46 69 6c 65 41 74 74 72  ile( GetFileAttr
14210 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
14220 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ed)!=INVALID_FIL
14230 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
14240 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20 3d             (rc =
14250 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f   DeleteFileW(zCo
14260 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26 20  nverted))==0 && 
14270 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 29  retryIoerr(&cnt)
14280 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72 63   ){}.    rc = rc
14290 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
142a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 2f 2a 20  QLITE_ERROR;./* 
142b0 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
142c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
142d0 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
142e0 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
142f0 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
14300 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
14310 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
14320 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
14330 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
14340 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
14350 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
14360 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
14370 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
14380 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
14390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
143a0 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
143b0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
143c0 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 21 3d  sA(zConverted)!=
143d0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
143e0 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
143f0 20 20 20 20 20 20 28 72 63 20 3d 20 44 65 6c 65        (rc = Dele
14400 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
14410 65 64 29 29 3d 3d 30 20 26 26 20 72 65 74 72 79  ed))==0 && retry
14420 49 6f 65 72 72 28 26 63 6e 74 29 20 29 7b 7d 0a  Ioerr(&cnt) ){}.
14430 20 20 20 20 72 63 20 3d 20 72 63 20 3f 20 53 51      rc = rc ? SQ
14440 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
14450 5f 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 20  _ERROR;.#endif. 
14460 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
14470 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
14480 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14490 5f 44 45 4c 45 54 45 2c 20 22 77 69 6e 44 65 6c  _DELETE, "winDel
144a0 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
144b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
144c0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
144d0 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72  }.  free(zConver
144e0 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
144f0 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20  ("DELETE \"%s\" 
14500 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
14510 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22  , (rc ? "failed"
14520 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72   : "ok" )));.  r
14530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14540 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
14550 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stance and statu
14560 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
14570 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
14580 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
14590 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
145a0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
145b0 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
145c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
145d0 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
145e0 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
145f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
14620 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
14630 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
14640 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
14650 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
14660 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
14670 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
14680 63 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  c = 0;.  void *z
14690 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
146a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
146b0 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  fs);..  Simulate
146c0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
146d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
146e0 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65  ESS; );.  zConve
146f0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
14700 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
14710 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
14720 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
14730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14740 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
14750 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69   isNT() ){.    i
14760 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
14770 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
14780 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
14790 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
147a0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
147b0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
147c0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
147d0 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72  rc = GetFileAttr
147e0 69 62 75 74 65 73 45 78 57 28 28 57 43 48 41 52  ibutesExW((WCHAR
147f0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
14820 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
14830 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
14860 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 29  retryIoerr(&cnt)
14870 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
14880 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
14890 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
148a0 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
148b0 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
148c0 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
148d0 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
148e0 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
148f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
14900 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
14910 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
14920 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
14930 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
14940 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
14950 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
14960 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
14970 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
14980 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
14990 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
149a0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
149b0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
149c0 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
149d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
149e0 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72  {.      logIoerr
149f0 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (cnt);.      if(
14a00 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21   GetLastError()!
14a10 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
14a20 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
14a30 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14a40 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
14a50 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a  , "winAccess", z
14a60 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
14a70 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
14a80 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
14a90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14aa0 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d  _ACCESS;.      }
14ab0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
14ac0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
14ad0 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
14ae0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69      }.    }./* i
14af0 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
14b00 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
14b10 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
14b20 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
14b30 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
14b40 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66  ASCII version of
14b50 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
14b60 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
14b70 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
14b80 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
14b90 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
14ba0 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
14bb0 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
14bc0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
14bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72   }else{.    attr
14be0 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
14bf0 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
14c00 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
14c10 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
14c20 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63  verted);.  switc
14c30 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
14c40 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
14c50 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73  SS_READ:.    cas
14c60 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
14c70 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63  EXISTS:.      rc
14c80 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
14c90 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
14ca0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14cb0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
14cc0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
14cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
14ce0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
14cf0 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20  TTRIBUTES &&.   
14d00 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20            (attr 
14d10 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
14d20 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20  _READONLY)==0;. 
14d30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14d40 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
14d50 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
14d60 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
14d70 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
14d80 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
14d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
14da0 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
14db0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
14dc0 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
14dd0 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
14de0 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
14df0 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
14e00 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
14e10 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
14e20 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
14e30 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
14e40 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
14e50 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
14e60 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
14e70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
14e80 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
14e90 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
14ea0 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20   *zRelative,    
14eb0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
14ec0 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
14ed0 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75  ath */.  int nFu
14ee0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
14ef0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
14f00 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
14f10 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
14f20 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20  ar *zFull       
14f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14f40 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
14f50 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ){.  .#if define
14f60 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
14f70 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14f80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14f90 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
14fa0 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
14fb0 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76  );.  cygwin_conv
14fc0 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70  _to_full_win32_p
14fd0 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a  ath(zRelative, z
14fe0 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Full);.  return 
14ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
15000 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
15010 5f 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61 74  _WINCE.  Simulat
15020 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
15030 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
15040 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
15050 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f 2a  TER(nFull);.  /*
15060 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
15070 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
15080 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
15090 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
150a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  /.  sqlite3_snpr
150b0 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74  intf(pVfs->mxPat
150c0 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25  hname, zFull, "%
150d0 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  s", zRelative);.
150e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
150f0 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
15100 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
15110 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
15120 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e  YGWIN__).  int n
15130 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
15140 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
15150 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66   *zOut;..  /* If
15160 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20   this path name 
15170 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a  begins with "/X:
15180 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20  ", where "X" is 
15190 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20  any alphabetic. 
151a0 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64   ** character, d
151b0 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69  iscard the initi
151c0 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20  al "/" from the 
151d0 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  pathname..  */. 
151e0 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30   if( zRelative[0
151f0 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65  ]=='/' && sqlite
15200 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69  3Isalpha(zRelati
15210 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74  ve[1]) && zRelat
15220 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20  ive[2]==':' ){. 
15230 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
15240 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f    }..  /* It's o
15250 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
15260 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
15270 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
15280 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
15290 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
152a0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
152b0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
152c0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
152d0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
152e0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
152f0 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
15300 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
15310 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
15320 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
15330 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
15340 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
15350 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
15360 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
15370 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
15380 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
15390 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
153a0 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
153b0 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
153c0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
153d0 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d  .    WCHAR *zTem
153e0 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47  p;.    nByte = G
153f0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
15400 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
15410 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33  ed, 0, 0, 0) + 3
15420 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61  ;.    zTemp = ma
15430 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65  lloc( nByte*size
15440 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
15450 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
15460 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a   ){.      free(z
15470 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
15480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15490 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
154a0 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
154b0 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
154c0 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
154d0 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65  mp, 0);.    free
154e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
154f0 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65    zOut = unicode
15500 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  ToUtf8(zTemp);. 
15510 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a     free(zTemp);.
15520 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
15530 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
15540 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
15550 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
15560 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
15570 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
15580 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
15590 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
155a0 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
155b0 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
155c0 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
155d0 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
155e0 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
155f0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
15600 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
15610 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
15620 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c   nByte = GetFull
15630 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
15640 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
15650 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a  0, 0) + 3;.    z
15660 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Temp = malloc( n
15670 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
15680 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
15690 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
156a0 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
156b0 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
156c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
156d0 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75 6c      }.    GetFul
156e0 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
156f0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  *)zConverted, nB
15700 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
15710 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
15720 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
15730 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
15740 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
15750 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 65  p);.    free(zTe
15760 6d 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  mp);.#endif.  }.
15770 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20    if( zOut ){.  
15780 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
15790 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  tf(pVfs->mxPathn
157a0 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  ame, zFull, "%s"
157b0 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 66 72 65  , zOut);.    fre
157c0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
157d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
157e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
157f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
15800 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
15810 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 73 65 63  *.** Get the sec
15820 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
15830 64 65 76 69 63 65 20 75 73 65 64 20 74 6f 20 73  device used to s
15840 74 6f 72 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f  tore.** file..*/
15850 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
15860 65 63 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73  ectorSize(.    s
15870 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
15880 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ,.    const char
15890 20 2a 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20   *zRelative     
158a0 2f 2a 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61  /* UTF-8 file na
158b0 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  me */.){.  DWORD
158c0 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 20   bytesPerSector 
158d0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
158e0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
158f0 2f 2a 20 47 65 74 44 69 73 6b 46 72 65 65 53 70  /* GetDiskFreeSp
15900 61 63 65 20 69 73 20 6e 6f 74 20 73 75 70 70 6f  ace is not suppo
15910 72 74 65 64 20 75 6e 64 65 72 20 57 49 4e 43 45  rted under WINCE
15920 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
15930 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55 53 45 44  S_WINCE.  UNUSED
15940 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
15950 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
15960 45 54 45 52 28 7a 52 65 6c 61 74 69 76 65 29 3b  ETER(zRelative);
15970 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20 7a 46  .#else.  char zF
15980 75 6c 6c 70 61 74 68 5b 4d 41 58 5f 50 41 54 48  ullpath[MAX_PATH
15990 2b 31 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  +1];.  int rc;. 
159a0 20 44 57 4f 52 44 20 64 77 52 65 74 20 3d 20 30   DWORD dwRet = 0
159b0 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 75 6d 6d  ;.  DWORD dwDumm
159c0 79 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65  y;..  /*.  ** We
159d0 20 6e 65 65 64 20 74 6f 20 67 65 74 20 74 68 65   need to get the
159e0 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 20   full path name 
159f0 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  of the file.  **
15a00 20 74 6f 20 67 65 74 20 74 68 65 20 64 72 69 76   to get the driv
15a10 65 20 6c 65 74 74 65 72 20 74 6f 20 6c 6f 6f 6b  e letter to look
15a20 20 75 70 20 74 68 65 20 73 65 63 74 6f 72 0a 20   up the sector. 
15a30 20 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20   ** size..  */. 
15a40 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15a50 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 72 63 20  Benign(1);.  rc 
15a60 3d 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  = winFullPathnam
15a70 65 28 70 56 66 73 2c 20 7a 52 65 6c 61 74 69 76  e(pVfs, zRelativ
15a80 65 2c 20 4d 41 58 5f 50 41 54 48 2c 20 7a 46 75  e, MAX_PATH, zFu
15a90 6c 6c 70 61 74 68 29 3b 0a 20 20 53 69 6d 75 6c  llpath);.  Simul
15aa0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
15ab0 28 30 29 3b 0a 20 20 69 66 28 20 72 63 20 3d 3d  (0);.  if( rc ==
15ac0 20 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20 7b   SQLITE_OK ).  {
15ad0 0a 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  .    void *zConv
15ae0 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
15af0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c  tf8Filename(zFul
15b00 6c 70 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  lpath);.    if( 
15b10 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20  zConverted ){.  
15b20 20 20 20 20 69 66 28 20 69 73 4e 54 28 29 20 29      if( isNT() )
15b30 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69  {.        /* tri
15b40 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64  m path to just d
15b50 72 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a  rive reference *
15b60 2f 0a 20 20 20 20 20 20 20 20 57 43 48 41 52 20  /.        WCHAR 
15b70 2a 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b  *p = zConverted;
15b80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70  .        for(;*p
15b90 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ;p++){.         
15ba0 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20   if( *p == '\\' 
15bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
15bc0 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  p = '\0';.      
15bd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15bf0 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65 74   }.        dwRet
15c00 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53 70   = GetDiskFreeSp
15c10 61 63 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  aceW((WCHAR*)zCo
15c20 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
15c50 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mmy,.           
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 20 20 20 20 26 62 79 74 65 73 50 65 72         &bytesPer
15c80 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  Sector,.        
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ca0 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d            &dwDum
15cb0 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  my,.            
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b        &dwDummy);
15ce0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15cf0 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61        /* trim pa
15d00 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65  th to just drive
15d10 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20   reference */.  
15d20 20 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20        char *p = 
15d30 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72 74  (char *)zConvert
15d40 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ed;.        for(
15d50 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ;*p;p++){.      
15d60 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c      if( *p == '\
15d70 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  \' ){.          
15d80 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20    *p = '\0';.   
15d90 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15da0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77      }.        dw
15dc0 52 65 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65  Ret = GetDiskFre
15dd0 65 53 70 61 63 65 41 28 28 63 68 61 72 2a 29 7a  eSpaceA((char*)z
15de0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77               &dw
15e10 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20  Dummy,.         
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e30 20 20 20 20 20 20 20 20 20 26 62 79 74 65 73 50           &bytesP
15e40 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20  erSector,.      
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
15e70 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ummy,.          
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
15ea0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15eb0 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
15ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
15ed0 20 21 64 77 52 65 74 20 29 7b 0a 20 20 20 20 20   !dwRet ){.     
15ee0 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 20   bytesPerSector 
15ef0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
15f00 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
15f10 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
15f20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 62 79   return (int) by
15f30 74 65 73 50 65 72 53 65 63 74 6f 72 3b 20 0a 7d  tesPerSector; .}
15f40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15f50 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
15f60 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
15f70 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
15f80 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
15f90 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
15fa0 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
15fb0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
15fc0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
15fd0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
15fe0 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  brary..*/./*.** 
15ff0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
16000 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
16010 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
16020 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
16030 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
16040 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
16050 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
16060 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
16070 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
16080 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
16090 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
160a0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
160b0 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76  .  HANDLE h;.  v
160c0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
160d0 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
160e0 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
160f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16100 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66  ETER(pVfs);.  if
16110 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
16120 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
16130 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
16140 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61  ) ){.    h = Loa
16150 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41 52  dLibraryW((WCHAR
16160 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 2f  *)zConverted);./
16170 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
16180 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
16190 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
161a0 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
161b0 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
161c0 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
161d0 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
161e0 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
161f0 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
16200 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
16210 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
16220 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
16230 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
16240 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
16250 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68  0.  }else{.    h
16260 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   = LoadLibraryA(
16270 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
16280 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
16290 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
162a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
162b0 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76  d*)h;.}.static v
162c0 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73  oid winDlError(s
162d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
162e0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
162f0 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e   *zBufOut){.  UN
16300 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
16310 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45  Vfs);.  getLastE
16320 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42  rrorMsg(nBuf, zB
16330 75 66 4f 75 74 29 3b 0a 7d 0a 76 6f 69 64 20 28  ufOut);.}.void (
16340 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
16350 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
16360 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73  d *pHandle, cons
16370 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29  t char *zSymbol)
16380 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45  )(void){.  UNUSE
16390 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
163a0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
163b0 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
163c0 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
163d0 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
163e0 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 77  y available on w
163f0 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72  ince. */.  retur
16400 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
16410 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  )GetProcAddressA
16420 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
16430 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73  , zSymbol);.#els
16440 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72  e.  /* All other
16450 20 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72   windows platfor
16460 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f  ms expect GetPro
16470 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61  cAddress() to ta
16480 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69 20  ke.  ** an Ansi 
16490 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73  string regardles
164a0 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44  s of the _UNICOD
164b0 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72  E setting */.  r
164c0 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
164d0 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64 64 72  oid))GetProcAddr
164e0 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ess((HANDLE)pHan
164f0 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23  dle, zSymbol);.#
16500 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e  endif.}.void win
16510 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
16520 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
16530 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
16540 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
16550 66 73 29 3b 0a 20 20 46 72 65 65 4c 69 62 72 61  fs);.  FreeLibra
16560 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  ry((HANDLE)pHand
16570 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
16580 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
16590 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
165a0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
165b0 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
165c0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
165d0 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
165e0 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
165f0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
16600 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
16610 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70  ../*.** Write up
16620 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f   to nBuf bytes o
16630 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74  f randomness int
16640 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  o zBuf..*/.stati
16650 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e  c int winRandomn
16660 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
16670 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
16680 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
16690 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55  int n = 0;.  UNU
166a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
166b0 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  fs);.#if defined
166c0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
166d0 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
166e0 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
166f0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73  );.#else.  if( s
16700 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
16710 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
16720 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
16730 20 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65     GetSystemTime
16740 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&x);.    memcpy
16750 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73  (&zBuf[n], &x, s
16760 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e  izeof(x));.    n
16770 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20   += sizeof(x);. 
16780 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
16790 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
167a0 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20  {.    DWORD pid 
167b0 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  = GetCurrentProc
167c0 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
167d0 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
167e0 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
167f0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
16800 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66  f(pid);.  }.  if
16810 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c  ( sizeof(DWORD)<
16820 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44  =nBuf-n ){.    D
16830 57 4f 52 44 20 63 6e 74 20 3d 20 47 65 74 54 69  WORD cnt = GetTi
16840 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d  ckCount();.    m
16850 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
16860 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
16870 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
16880 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20  eof(cnt);.  }.  
16890 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45  if( sizeof(LARGE
168a0 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d  _INTEGER)<=nBuf-
168b0 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  n ){.    LARGE_I
168c0 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 51 75  NTEGER i;.    Qu
168d0 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
168e0 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d  unter(&i);.    m
168f0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
16900 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a  &i, sizeof(i));.
16910 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
16920 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i);.  }.#endif. 
16930 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
16940 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
16950 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
16960 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
16970 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
16980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16990 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
169a0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
169b0 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65 65  icrosec){.  Slee
169c0 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29  p((microsec+999)
169d0 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44  /1000);.  UNUSED
169e0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
169f0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63  ;.  return ((mic
16a00 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
16a10 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *1000;.}../*.** 
16a20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
16a30 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74  riable, if set t
16a40 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
16a50 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74  ue, is interpret
16a60 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d  ed as.** the num
16a70 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73  ber of seconds s
16a80 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73  ince 1970 and is
16a90 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
16aa0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71   result of.** sq
16ab0 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69  lite3OsCurrentTi
16ac0 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74  me() during test
16ad0 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
16ae0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
16af0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
16b00 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b  ime = 0;  /* Fak
16b10 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e  e system time in
16b20 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
16b30 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  970. */.#endif..
16b40 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
16b50 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
16b60 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
16b70 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
16b80 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a  ite into *piNow.
16b90 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ** the current t
16ba0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
16bb0 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
16bc0 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30  ber times 86_400
16bd0 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68  _000.  In.** oth
16be0 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20  er words, write 
16bf0 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20  into *piNow the 
16c00 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
16c10 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65  econds since the
16c20 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68   Julian.** epoch
16c30 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65   of noon in Gree
16c40 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65  nwich on Novembe
16c50 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61  r 24, 4714 B.C a
16c60 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a  ccording to the.
16c70 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65  ** proleptic Gre
16c80 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e  gorian calendar.
16c90 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
16ca0 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  s, return 0.  Re
16cb0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
16cc0 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
16cd0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
16ce0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
16cf0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
16d00 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
16d10 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
16d20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49  *piNow){.  /* FI
16d30 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65  LETIME structure
16d40 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c   is a 64-bit val
16d50 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ue representing 
16d60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20  the number of . 
16d70 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f      100-nanoseco
16d80 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e  nd intervals sin
16d90 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36  ce January 1, 16
16da0 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33  01 (= JD 2305813
16db0 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c  .5). .  */.  FIL
16dc0 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74  ETIME ft;.  stat
16dd0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
16de0 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69  _int64 winFileti
16df0 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31  meEpoch = 230581
16e00 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  35*(sqlite3_int6
16e10 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65  4)8640000;.#ifde
16e20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
16e30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
16e40 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
16e50 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
16e60 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
16e70 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20  640000;.#endif. 
16e80 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76   /* 2^32 - to av
16e90 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e  oid use of LL an
16ea0 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63  d warnings in gc
16eb0 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  c */.  static co
16ec0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
16ed0 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20  4 max32BitValue 
16ee0 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65  = .      (sqlite
16ef0 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
16f00 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
16f10 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
16f20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
16f30 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
16f40 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
16f50 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
16f60 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  e;.  GetSystemTi
16f70 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20  me(&time);.  /* 
16f80 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  if SystemTimeToF
16f90 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c  ileTime() fails,
16fa0 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
16fb0 2e 20 2a 2f 0a 20 20 69 66 20 28 21 53 79 73 74  . */.  if (!Syst
16fc0 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
16fd0 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20  (&time,&ft)){.  
16fe0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
16ff0 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74 65  #else.  GetSyste
17000 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28  mTimeAsFileTime(
17010 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a   &ft );.#endif..
17020 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69    *piNow = winFi
17030 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20  letimeEpoch +.  
17040 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73 71            ((((sq
17050 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
17060 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d  wHighDateTime)*m
17070 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20  ax32BitValue) + 
17080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17090 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
170a0 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
170b0 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
170c0 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
170d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
170e0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
170f0 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
17100 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
17110 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
17120 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
17130 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
17140 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
17150 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
17160 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
17170 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
17180 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
17190 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
171a0 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
171b0 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
171c0 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
171d0 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
171e0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
171f0 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
17200 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
17210 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
17220 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
17230 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43  und..*/.int winC
17240 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
17250 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
17260 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
17270 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
17280 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
17290 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
172a0 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
172b0 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
172c0 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
172d0 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
172e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
172f0 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
17300 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
17310 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
17320 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
17330 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
17340 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
17350 65 28 29 20 6f 6e 20 77 69 6e 64 6f 77 73 20 28  e() on windows (
17360 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
17370 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
17380 75 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  unix). After an 
17390 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
173a0 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
173b0 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
173c0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
173d0 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
173e0 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
173f0 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
17400 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
17410 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
17420 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
17430 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
17440 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
17450 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
17460 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
17470 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
17480 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
17490 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
174a0 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
174b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
174c0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
174d0 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
174e0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
174f0 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
17500 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
17510 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
17520 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
17530 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
17540 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
17550 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
17560 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
17570 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
17580 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
17590 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
175a0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
175b0 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
175c0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
175d0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
175e0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
175f0 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
17600 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
17610 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
17620 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
17630 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
17640 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
17650 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
17660 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
17670 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
17680 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
17690 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
176a0 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
176b0 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
176c0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
176d0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
176e0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
176f0 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
17700 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
17710 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
17720 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
17730 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
17740 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
17750 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
17760 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
17770 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
17780 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
17790 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
177a0 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
177b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
177c0 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
177d0 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
177e0 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
177f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
17800 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
17810 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
17820 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
17830 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
17840 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
17850 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74    return getLast
17860 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a  ErrorMsg(nBuf, z
17870 42 75 66 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  Buf);.}..../*.**
17880 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
17890 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
178a0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
178b0 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
178c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
178d0 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
178e0 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
178f0 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
17900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17910 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
17920 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
17930 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
17940 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d  zOsFile */.    M
17950 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20  AX_PATH,        
17960 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
17970 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17990 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
179a0 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
179b0 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
179c0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
179d0 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
179e0 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
179f0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
17a00 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
17a10 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
17a20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
17a30 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
17a40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
17a50 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
17a60 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
17a70 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
17a80 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
17a90 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
17aa0 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
17ab0 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
17ac0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
17ad0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
17ae0 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
17af0 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
17b00 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
17b10 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
17b20 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
17b30 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
17b40 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
17b50 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
17b60 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
17b70 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
17b80 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
17b90 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
17ba0 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
17bb0 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
17bc0 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
17bd0 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
17be0 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
17bf0 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
17c00 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
17c10 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53          /* xSetS
17c20 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
17c30 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
17c40 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73        /* xGetSys
17c50 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 30  temCall */.    0
17c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17c70 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
17c80 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a  emCall */.  };..
17c90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17ca0 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74  MIT_WAL.  /* get
17cb0 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
17cc0 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
17cd0 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
17ce0 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
17cf0 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
17d00 4f 29 29 3b 0a 20 20 47 65 74 53 79 73 74 65 6d  O));.  GetSystem
17d10 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
17d20 29 3b 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53  );.  assert(winS
17d30 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
17d40 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e  ionGranularity >
17d50 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73   0);.#endif..  s
17d60 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
17d70 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
17d80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17d90 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69  _OK; .}.int sqli
17da0 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
17db0 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  { .  return SQLI
17dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
17dd0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
17de0 4e 20 2a 2f 0a                                   N */.