/ Hex Artifact Content
Login

Artifact 3bb7e081045aa4c811197ead66febdf8d6209275:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f 6e 6c 79  for windows only
0210: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f   */.../*.** A No
0220: 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79 20  te About Memory 
0230: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  Allocation:.**.*
0240: 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75 73  * This driver us
0250: 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65  es malloc()/free
0260: 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74 68  () directly rath
0270: 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74 68  er than going th
0280: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51 4c  rough.** the SQL
0290: 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71 6c  ite-wrappers sql
02a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71  ite3_malloc()/sq
02b0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20 54  lite3_free().  T
02c0: 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a 2a  hose wrappers.**
02d0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66 6f   are designed fo
02e0: 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64 65  r use on embedde
02f0: 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  d systems where 
0300: 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63 65  memory is scarce
0310: 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66   and.** malloc f
0320: 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66  ailures happen f
0330: 72 65 71 75 65 6e 74 6c 79 2e 20 20 57 69 6e 33  requently.  Win3
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 64 65 73  n windows.** des
0710: 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74 20 73 6f  ktops but not so
0720: 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65   well in embedde
0730: 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23  d systems..*/..#
0740: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65  include <winbase
0750: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59  .h>..#ifdef __CY
0760: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0770: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0780: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0790: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74  cros used to det
07a0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
07b0: 72 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72  r not to use thr
07c0: 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  eads..*/.#if def
07d0: 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
07e0: 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23   && THREADSAFE.#
07f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0800: 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  32_THREADS 1.#en
0810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75  dif../*.** Inclu
0820: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0830: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0840: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0850: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0860: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  n.h"../*.** Some
0870: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
0880: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
0890: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
08a0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
08b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
08c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
08d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
08e0: 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64  (DWORD)-1) .#end
08f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  if../*.** Determ
0900: 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64 65  ine if we are de
0910: 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64 6f  aling with Windo
0920: 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61 73  wsCE - which has
0930: 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75 63   a much.** reduc
0940: 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  ed API..*/.#if S
0950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
0960: 20 64 65 66 69 6e 65 20 41 72 65 46 69 6c 65 41   define AreFileA
0970: 70 69 73 41 4e 53 49 28 29 20 31 0a 23 20 64 65  pisANSI() 1.# de
0980: 66 69 6e 65 20 46 6f 72 6d 61 74 4d 65 73 73 61  fine FormatMessa
0990: 67 65 57 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  geW(a,b,c,d,e,f,
09a0: 67 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  g) 0.#endif../* 
09b0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
09c0: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
09d0: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
09e0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
09f0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
0a00: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
0a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a20: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
0a30: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
0a40: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
0a50: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  memory */../*.**
0a60: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0a70: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0a80: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0a90: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0aa0: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0ab0: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
0ad0: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
0ae0: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
0af0: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
0b00: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
0b10: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
0b20: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
0b30: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
0b40: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0b50: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
0b80: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
0b90: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
0ba0: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
0bb0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0bc0: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
0bd0: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0be0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0bf0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0c00: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
0c10: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
0c20: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
0c30: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
0c40: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
0c50: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
0c60: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
0c70: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
0ca0: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
0cb0: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
0cc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0cd0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
0ce0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
0cf0: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
0d00: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
0d10: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
0d20: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
0d30: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
0d60: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
0d70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
0d80: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
0d90: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
0da0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0db0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0dc0: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0dd0: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0de0: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0df0: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0e00: 63 6b 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  ck */.  DWORD la
0e10: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
0e20: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
0e30: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
0e40: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
0e50: 20 20 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69    DWORD sectorSi
0e60: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ze;       /* Sec
0e70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
0e80: 64 65 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f  device file is o
0e90: 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  n */.  winShm *p
0ea0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
0eb0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
0ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
0ed0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
0ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0ef0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0f00: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0f10: 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ile */.#if SQLIT
0f20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  E_OS_WINCE.  WCH
0f30: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
0f40: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
0f50: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
0f60: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
0f70: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
0f90: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
0fa0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
0fb0: 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48  ed lock */  .  H
0fc0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
0fd0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
0fe0: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
0ff0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1000: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1010: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
1020: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
1030: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
1040: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
1050: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
1060: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
1070: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
1080: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
1090: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  le  */.#endif.};
10a0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
10b0: 70 72 6f 74 6f 74 79 70 65 73 2e 0a 2a 2f 0a 73  prototypes..*/.s
10c0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63  tatic int getSec
10d0: 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c  torSize(.    sql
10e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
10f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1100: 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a  zRelative     /*
1110: 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65   UTF-8 file name
1120: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.);../*.** Th
1130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1140: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
1150: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
1160: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
1170: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
1180: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
1190: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11a0: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35 0a 2a  ystem is Win95.*
11b0: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
11c0: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
11d0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
11e0: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
11f0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
1200: 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  95..** 2:   Oper
1210: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
1220: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
1230: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
1240: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
1250: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
1260: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
1270: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
1280: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
1290: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
12a0: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
12b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12c0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
12d0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
12e0: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73  lse.static int s
12f0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1300: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1310: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
1320: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
1330: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
1340: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
1350: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
1360: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
1370: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
1380: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
1390: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
13a0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
13b0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
13c0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
13d0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
13e0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
13f0: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
1400: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
1410: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
1420: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
1430: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
1440: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
1450: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
1460: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
1470: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1480: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1490: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
14a0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
14b0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
14c0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
14d0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
14e0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
14f0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
1500: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
1510: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1520: 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20 69 73  INCE.# define is
1530: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a  NT()  (1).#else.
1540: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
1550: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
1560: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
1580: 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f  ERSIONINFO sInfo
1590: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
15a0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
15b0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
15c0: 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72 73  );.      GetVers
15d0: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
15e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
15f0: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
1600: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
1610: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
1620: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
1630: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1640: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
1650: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1660: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
1670: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1680: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
1690: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
16a0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
16b0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
16c0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
16d0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
16e0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
16f0: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
1700: 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  *utf8ToUnicode(c
1710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1720: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
1730: 61 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69  ar;.  WCHAR *zWi
1740: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
1750: 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65  Char = MultiByte
1760: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
1770: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
1780: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
1790: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
17a0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a  = malloc( nChar*
17b0: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
17c0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
17d0: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
17e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17f0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
1800: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
1810: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
1820: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
1830: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
1840: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
1850: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72  har==0 ){.    fr
1860: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
1870: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
1880: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
1890: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
18a0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
18b0: 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74  onvert microsoft
18c0: 20 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   unicode to UTF-
18d0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
18e0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
18f0: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
1900: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
1910: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
1920: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
1930: 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a  8(const WCHAR *z
1940: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
1950: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
1960: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
1970: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1980: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1990: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
19a0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
19b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  0, 0, 0);.  zFil
19c0: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
19d0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
19e0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
19f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a00: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
1a10: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
1a20: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
1a30: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
1a40: 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a  ilename, nByte,.
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
1a70: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
1a80: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65   == 0 ){.    fre
1a90: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1aa0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
1ab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
1ac0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1ad0: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e 73  * Convert an ans
1ae0: 69 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72  i string to micr
1af0: 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20 62  osoft unicode, b
1b00: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
1b10: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
1b20: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
1b30: 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53  e apis..** .** S
1b40: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1b50: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1b60: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
1b70: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
1b80: 73 74 61 74 69 63 20 57 43 48 41 52 20 2a 6d 62  static WCHAR *mb
1b90: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
1ba0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1bb0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
1bc0: 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62 63 73 46  .  WCHAR *zMbcsF
1bd0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
1be0: 6f 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c  odepage = AreFil
1bf0: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
1c00: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
1c10: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74  ..  nByte = Mult
1c20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
1c30: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
1c40: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
1c50: 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  ,0)*sizeof(WCHAR
1c60: 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  );.  zMbcsFilena
1c70: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1c80: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
1c90: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
1ca0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
1cb0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1cc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1cd0: 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  te = MultiByteTo
1ce0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
1cf0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
1d00: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
1d10: 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  me, nByte);.  if
1d20: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
1d30: 20 20 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65    free(zMbcsFile
1d40: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
1d50: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
1d60: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
1d70: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1d80: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f  ** Convert micro
1d90: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20  soft unicode to 
1da0: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
1db0: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
1dc0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
1dd0: 27 73 20 41 6e 73 69 20 63 6f 64 65 70 61 67 65  's Ansi codepage
1de0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
1df0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
1e00: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1e10: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
1e20: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
1e30: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
1e40: 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57 43 48 41  oMbcs(const WCHA
1e50: 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  R *zWideFilename
1e60: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
1e70: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1e80: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
1e90: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
1ea0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
1eb0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
1ec0: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1ed0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
1ee0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
1ef0: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
1f00: 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  0, 0);.  zFilena
1f10: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1f20: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
1f30: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
1f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f50: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
1f60: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
1f70: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
1f80: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
1f90: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
1fc0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
1fd0: 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  = 0 ){.    free(
1fe0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
1ff0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2000: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
2010: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
2020: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
2030: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
2040: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
2050: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
2060: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
2070: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
2080: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
2090: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
20a0: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
20b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
20c0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
20d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
20e0: 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69  .  WCHAR *zTmpWi
20f0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
2100: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
2110: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2120: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
2130: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2140: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
2150: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
2160: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
2170: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
2180: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
2190: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
21a0: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
21b0: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
21c0: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
21d0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
21e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
21f0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
2200: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
2210: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2220: 75 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74  utf8ToMbcs(const
2230: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2240: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
2250: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 57 43 48 41  nameMbcs;.  WCHA
2260: 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  R *zTmpWide;..  
2270: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
2280: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
2290: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
22a0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
22b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
22c0: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
22d0: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
22e0: 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a 54  Wide);.  free(zT
22f0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
2300: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
2310: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2320: 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  S_WINCE./*******
2330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69  **.** This secti
2380: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  on contains code
2390: 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e   for WinCE only.
23a0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .*/./*.** Window
23b0: 73 43 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  sCE does not hav
23c0: 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
23d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72  function.  So cr
23e0: 65 61 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69  eate a.** substi
23f0: 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tute..*/.#includ
2400: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
2410: 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
2420: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
2430: 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
2440: 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
2450: 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
2460: 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
2470: 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
2480: 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
2490: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
24a0: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
24b0: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
24c0: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
24d0: 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
24e0: 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
24f0: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
2500: 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
2510: 34 20 3e 3e 20 33 32 29 3b 0a 20 20 46 69 6c 65  4 >> 32);.  File
2520: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2530: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
2540: 20 20 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74    FileTimeToSyst
2550: 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d  emTime(&lTm,&pTm
2560: 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d  );.  y.tm_year =
2570: 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30   pTm.wYear - 190
2580: 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20  0;.  y.tm_mon = 
2590: 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a  pTm.wMonth - 1;.
25a0: 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54    y.tm_wday = pT
25b0: 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20  m.wDayOfWeek;.  
25c0: 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e  y.tm_mday = pTm.
25d0: 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75  wDay;.  y.tm_hou
25e0: 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20  r = pTm.wHour;. 
25f0: 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e   y.tm_min = pTm.
2600: 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f  wMinute;.  y.tm_
2610: 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e  sec = pTm.wSecon
2620: 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a  d;.  return &y;.
2630: 7d 0a 0a 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20  }../* This will 
2640: 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 2c  never be called,
2650: 20 62 75 74 20 64 65 66 69 6e 65 64 20 74 6f 20   but defined to 
2660: 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20 63 6f  make the code co
2670: 6d 70 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  mpile */.#define
2680: 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 61 2c   GetTempPathA(a,
2690: 62 29 0a 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b  b)..#define Lock
26a0: 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20  File(a,b,c,d,e) 
26b0: 20 20 20 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46        winceLockF
26c0: 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  ile(&a, b, c, d,
26d0: 20 65 29 0a 23 64 65 66 69 6e 65 20 55 6e 6c 6f   e).#define Unlo
26e0: 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65  ckFile(a,b,c,d,e
26f0: 29 20 20 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63  )     winceUnloc
2700: 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20  kFile(&a, b, c, 
2710: 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 4c 6f  d, e).#define Lo
2720: 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64  ckFileEx(a,b,c,d
2730: 2c 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63  ,e,f)   winceLoc
2740: 6b 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63  kFileEx(&a, b, c
2750: 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 23 64 65 66  , d, e, f)..#def
2760: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
2770: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
2780: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
2790: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
27a0: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
27b0: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
27c0: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
27d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
27e0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
27f0: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
2800: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
2810: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
2820: 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62   WaitForSingleOb
2830: 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45  ject(h, INFINITE
2840: 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64  );.   } while (d
2850: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a  wErr != WAIT_OBJ
2860: 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21  ECT_0 && dwErr !
2870: 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44  = WAIT_ABANDONED
2880: 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  );.}./*.** Relea
2890: 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72  se a lock acquir
28a0: 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78  ed by winceMutex
28b0: 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65  Acquire().*/.#de
28c0: 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52  fine winceMutexR
28d0: 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73  elease(h) Releas
28e0: 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a  eMutex(h)../*.**
28f0: 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65   Create the mute
2900: 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d  x and shared mem
2910: 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2920: 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65  king in the file
2930: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
2940: 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42  File.*/.static B
2950: 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74 65 4c  OOL winceCreateL
2960: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
2970: 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
2980: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43  le *pFile){.  WC
2990: 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48  HAR *zTok;.  WCH
29a0: 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75 74 66 38  AR *zName = utf8
29b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
29c0: 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e  ame);.  BOOL bIn
29d0: 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 2f 2a  it = TRUE;..  /*
29e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
29f0: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
2a00: 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 26  /.  ZeroMemory(&
2a10: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69  pFile->local, si
2a20: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
2a30: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
2a40: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
2a50: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
2a60: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
2a70: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
2a80: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
2a90: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43  e. */.  zTok = C
2aa0: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29  harLowerW(zName)
2ab0: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b  ;.  for (;*zTok;
2ac0: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20  zTok++){.    if 
2ad0: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20  (*zTok == '\\') 
2ae0: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d  *zTok = '_';.  }
2af0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70  ..  /* Create/op
2b00: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74  en the named mut
2b10: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68  ex */.  pFile->h
2b20: 4d 75 74 65 78 20 3d 20 43 72 65 61 74 65 4d 75  Mutex = CreateMu
2b30: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
2b40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
2b50: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
2b60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
2b70: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
2b80: 72 72 6f 72 28 29 3b 0a 20 20 20 20 66 72 65 65  rror();.    free
2b90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
2ba0: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
2bb0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
2bc0: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
2bd0: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
2be0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
2bf0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
2c00: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
2c10: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
2c20: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
2c30: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
2c40: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
2c50: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
2c60: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
2c70: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
2c80: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
2c90: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
2ca0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
2cb0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
2cc0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
2cd0: 20 20 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61    CharUpperW(zNa
2ce0: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
2cf0: 68 61 72 65 64 20 3d 20 43 72 65 61 74 65 46 69  hared = CreateFi
2d00: 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
2d10: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
2d20: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2d50: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
2d60: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
2d70: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
2da0: 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61  );  ..  /* Set a
2db0: 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
2dc0: 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66  ates we're the f
2dd0: 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74  irst to create t
2de0: 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20  he memory so it 
2df0: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
2e00: 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
2e10: 2f 0a 20 20 69 66 20 28 47 65 74 4c 61 73 74 45  /.  if (GetLastE
2e20: 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52 5f  rror() == ERROR_
2e30: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
2e40: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
2e50: 53 45 3b 0a 20 20 7d 0a 0a 20 20 66 72 65 65 28  SE;.  }..  free(
2e60: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
2e70: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
2e80: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
2e90: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2ea0: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
2eb0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
2ec0: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
2ed0: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
2ee0: 63 6b 2a 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ck*)MapViewOfFil
2ef0: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
2f00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2f10: 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
2f20: 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
2f30: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
2f40: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
2f50: 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
2f60: 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
2f70: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2f80: 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
2f90: 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d  .    if (!pFile-
2fa0: 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20  >shared){.      
2fb0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
2fc0: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
2fd0: 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61  );.      CloseHa
2fe0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
2ff0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
3000: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
3010: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
3020: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
3030: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
3040: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
3050: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
3060: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
3070: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
3080: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
3090: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
30a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30b0: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
30c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30d0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
30e0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
30f0: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
3100: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
3110: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
3120: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
3130: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
3140: 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20 20 20  f (bInit) {.    
3150: 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46 69 6c 65  ZeroMemory(pFile
3160: 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a 65 6f 66  ->shared, sizeof
3170: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
3180: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
3190: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
31a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
31b0: 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  TRUE;.}../*.** D
31c0: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
31d0: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
31e0: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
31f0: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
3200: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
3210: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
3220: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
3230: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
3240: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
3250: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
3260: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
3270: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
3280: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
3290: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
32a0: 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
32b0: 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
32c0: 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
32d0: 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
32e0: 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
32f0: 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
3300: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
3310: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
3320: 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
3330: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3340: 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
3350: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
3360: 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
3370: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3380: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
3390: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
33a0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
33b0: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
33c0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
33d0: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
33e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
33f0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
3400: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
3410: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3420: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
3430: 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
3440: 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
3450: 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
3460: 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
3470: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
3480: 0a 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66  .    UnmapViewOf
3490: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
34a0: 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  ed);.    CloseHa
34b0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
34c0: 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
34d0: 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
34e0: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
34f0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
3500: 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20  ->hMutex);    . 
3510: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3520: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
3530: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
3540: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
3550: 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  /* .** An implem
3560: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3570: 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
3580: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
3590: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
35a0: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
35b0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
35c0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
35d0: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
35e0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
35f0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
3600: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
3610: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
3620: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3630: 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
3640: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
3650: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
3660: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
3670: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
3680: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3690: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
36a0: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
36b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
36c0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
36d0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
36e0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
36f0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
3700: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
3710: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
3720: 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
3730: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
3740: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
3750: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
3760: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
3770: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
3780: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
3790: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
37a0: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
37b0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
37c0: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
37d0: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
37e0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
37f0: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
3800: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
3810: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
3820: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
3830: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
3840: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
3850: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3860: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
3870: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
3880: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3890: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
38a0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
38b0: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
38c0: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
38d0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
38e0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
38f0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3900: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
3910: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
3920: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
3930: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
3940: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
3950: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
3960: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3970: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
3980: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
3990: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
39a0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
39b0: 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
39c0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
39d0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
39e0: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
39f0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3a00: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3a10: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
3a20: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
3a30: 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
3a40: 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
3a50: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3a60: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
3a70: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
3a80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
3a90: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
3aa0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3ab0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
3ac0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3ad0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3ae0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
3af0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
3b00: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3b10: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3b20: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
3b30: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
3b40: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
3b50: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
3b60: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
3b70: 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
3b80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
3b90: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
3ba0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
3bb0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
3bc0: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
3bd0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
3be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
3bf0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
3c00: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
3c10: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
3c20: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
3c30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3c40: 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
3c50: 41 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66  API of windows f
3c60: 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74  or wince.*/.stat
3c70: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c  ic BOOL winceUnl
3c80: 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c  ockFile(.  HANDL
3c90: 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  E *phFile,.  DWO
3ca0: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  RD dwFileOffsetL
3cb0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  ow,.  DWORD dwFi
3cc0: 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  leOffsetHigh,.  
3cd0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
3ce0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c  ytesToUnlockLow,
3cf0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
3d00: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
3d10: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
3d20: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
3d30: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
3d40: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
3d50: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
3d60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3d70: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
3d80: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
3d90: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
3da0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
3db0: 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
3dc0: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
3dd0: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
3de0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
3df0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
3e00: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
3e10: 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20  ader lock or an 
3e20: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
3e30: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
3e40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
3e50: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b  D)SHARED_FIRST){
3e60: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68  .    /* Did we h
3e70: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
3e80: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66   lock? */.    if
3e90: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
3ea0: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
3eb0: 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
3ec0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
3ed0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
3ee0: 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  RED_SIZE);.     
3ef0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
3f00: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
3f10: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
3f20: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
3f30: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
3f40: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
3f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
3f60: 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  id we just have 
3f70: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a  a reader lock? *
3f80: 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70  /.    else if (p
3f90: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3fa0: 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73  ders){.      ass
3fb0: 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
3fc0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
3fd0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
3fe0: 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66  IZE || nNumberOf
3ff0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
4000: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
4010: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
4020: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
4030: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
4040: 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
4050: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
4060: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
4070: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
4080: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
4090: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
40a0: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
40b0: 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
40c0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
40d0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
40e0: 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
40f0: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
4100: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
4110: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
4120: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
4130: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
4140: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
4150: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
4160: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
4170: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
4180: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
4190: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
41a0: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
41b0: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
41c0: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
41d0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
41e0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
41f0: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
4200: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
4210: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
4220: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
4230: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
4240: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
4250: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
4260: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
4270: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
4280: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
4290: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
42a0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
42b0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
42c0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
42d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
42e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
42f0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
4300: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
4310: 45 78 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64  Ex() API of wind
4320: 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f  ows for wince.*/
4330: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
4340: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
4350: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
4360: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
4370: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
4380: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
4390: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
43a0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
43b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
43c0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
43d0: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
43e0: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
43f0: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
4400: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
4410: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
4420: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
4430: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
4440: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
4450: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
4460: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
4470: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
4480: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
4490: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
44a0: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
44b0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
44c0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
44d0: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
44e0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
44f0: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
4500: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
4510: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
4520: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
4530: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
4540: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
4550: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
4560: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
4570: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
4580: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
4590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45d0: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
45e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
45f0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4640: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
4650: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
4660: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
4670: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
4680: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
4690: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
46a0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
46b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
4700: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
4710: 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
4720: 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
4730: 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
4740: 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
4750: 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
4760: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
4770: 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
4780: 74 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20 69  t, but windows i
4790: 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
47a0: 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
47b0: 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
47c0: 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
47d0: 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
47e0: 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
47f0: 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
4800: 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
4810: 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
4820: 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
4830: 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
4840: 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
4850: 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
4860: 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
4870: 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
4880: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
4890: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
48a0: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
48b0: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
48c0: 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
48d0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
48e0: 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
48f0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
4900: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
4910: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
4920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
4930: 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20  e->pShm==0 );.  
4940: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
4950: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  %d\n", pFile->h)
4960: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  );.  do{.    rc 
4970: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  = CloseHandle(pF
4980: 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
4990: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
49a0: 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
49b0: 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
49c0: 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
49d0: 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
49e0: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
49f0: 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31  & (Sleep(100), 1
4a00: 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
4a10: 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
4a20: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
4a30: 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
4a40: 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
4a50: 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
4a60: 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
4a70: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
4a80: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
4a90: 0a 20 20 20 20 20 20 20 20 20 20 20 44 65 6c 65  .           Dele
4aa0: 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a  teFileW(pFile->z
4ab0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d  DeleteOnClose)==
4ac0: 30 0a 20 20 20 20 20 20 20 20 26 26 20 47 65 74  0.        && Get
4ad0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
4ae0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
4af0: 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66  Close)!=0xffffff
4b00: 66 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63  ff .        && c
4b10: 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c  nt++ < WINCE_DEL
4b20: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20  ETION_ATTEMPTS. 
4b30: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 53 6c 65     ){.       Sle
4b40: 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69  ep(100);  /* Wai
4b50: 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72  t a little befor
4b60: 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a  e trying again *
4b70: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  /.    }.    free
4b80: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
4b90: 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
4ba0: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
4bb0: 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e 22 2c 20  CLOSE %d %s\n", 
4bc0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
4bd0: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
4be0: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
4bf0: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  -1);.  return rc
4c00: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
4c10: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a  QLITE_IOERR;.}..
4c20: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f  /*.** Some micro
4c30: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
4c40: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
4c50: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
4c60: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
4c70: 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
4c80: 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
4c90: 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
4ca0: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
4cb0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
4cc0: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
4cd0: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
4ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
4cf0: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
4d00: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
4d10: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
4d20: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
4d30: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
4d40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
4d50: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
4d60: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
4d70: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
4d80: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
4d90: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
4da0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
4db0: 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
4dc0: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
4dd0: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
4de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4df0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
4e00: 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
4e10: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
4e20: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
4e30: 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
4e40: 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e  fset */.){.  LON
4e50: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c  G upperBits = (L
4e60: 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
4e70: 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
4e80: 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74  .  LONG lowerBit
4e90: 73 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  s = (LONG)(offse
4ea0: 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
4eb0: 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77  .  DWORD rc;.  w
4ec0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
4ed0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
4ee0: 44 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 44  DWORD error;.  D
4ef0: 57 4f 52 44 20 67 6f 74 3b 0a 0a 20 20 61 73 73  WORD got;..  ass
4f00: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
4f10: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
4f20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
4f30: 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
4f40: 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
4f50: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
4f60: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
4f70: 74 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 53  type));.  rc = S
4f80: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46  etFilePointer(pF
4f90: 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  ile->h, lowerBit
4fa0: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
4fb0: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66  ILE_BEGIN);.  if
4fc0: 28 20 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  ( rc==INVALID_SE
4fd0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26  T_FILE_POINTER &
4fe0: 26 20 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74  & (error=GetLast
4ff0: 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
5000: 4f 52 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OR ){.    pFile-
5010: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
5020: 6f 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  or;.    return S
5030: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
5040: 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65 28    if( !ReadFile(
5050: 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
5060: 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b  amt, &got, 0) ){
5070: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
5080: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
5090: 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75  rror();.    retu
50a0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
50b0: 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20  READ;.  }.  if( 
50c0: 67 6f 74 3d 3d 28 44 57 4f 52 44 29 61 6d 74 20  got==(DWORD)amt 
50d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
50e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
50f0: 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
5100: 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
5110: 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
5120: 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
5130: 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
5140: 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
5150: 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
5160: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
5170: 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
5180: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
5190: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
51a0: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
51b0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
51c0: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
51d0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
51e0: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
51f0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
5200: 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71  t winWrite(.  sq
5210: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
5220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
5230: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f  to write into */
5240: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
5250: 42 75 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Buf,         /* 
5260: 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20  The bytes to be 
5270: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
5280: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
5290: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
52a0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
52b0: 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
52c0: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
52d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
52e0: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
52f0: 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
5300: 0a 29 7b 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  .){.  LONG upper
5310: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  Bits = (LONG)((o
5320: 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
5330: 66 66 66 66 66 66 66 29 3b 0a 20 20 4c 4f 4e 47  fffffff);.  LONG
5340: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
5350: 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
5360: 66 66 66 66 66 66 66 29 3b 0a 20 20 44 57 4f 52  fffffff);.  DWOR
5370: 44 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20  D rc;.  winFile 
5380: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5390: 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65  e*)id;.  DWORD e
53a0: 72 72 6f 72 3b 0a 20 20 44 57 4f 52 44 20 77 72  rror;.  DWORD wr
53b0: 6f 74 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ote = 0;..  asse
53c0: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
53d0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
53e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
53f0: 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
5400: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
5410: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
5420: 5f 46 55 4c 4c 29 3b 0a 20 20 4f 53 54 52 41 43  _FULL);.  OSTRAC
5430: 45 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63  E(("WRITE %d loc
5440: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
5450: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
5460: 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 53 65 74  pe));.  rc = Set
5470: 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
5480: 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
5490: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
54a0: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20  E_BEGIN);.  if( 
54b0: 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rc==INVALID_SET_
54c0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20  FILE_POINTER && 
54d0: 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74 45 72  (error=GetLastEr
54e0: 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
54f0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
5500: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72  astErrno = error
5510: 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
5520: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
5530: 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
5540: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LL ){.      retu
5550: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
5560: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
5580: 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
5590: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
55a0: 61 6d 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  amt>0 );.  while
55b0: 28 0a 20 20 20 20 20 61 6d 74 3e 30 0a 20 20 20  (.     amt>0.   
55c0: 20 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65    && (rc = Write
55d0: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
55e0: 42 75 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65  Buf, amt, &wrote
55f0: 2c 20 30 29 29 21 3d 30 0a 20 20 20 20 20 26 26  , 0))!=0.     &&
5600: 20 77 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20 20   wrote>0.  ){.  
5610: 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
5620: 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
5630: 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
5640: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20  ;.  }.  if( !rc 
5650: 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74  || amt>(int)wrot
5660: 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
5670: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
5680: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
5690: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
56a0: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
56b0: 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 7b 0a  LE_DISK_FULL ){.
56c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
56d0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65  ITE_FULL;.    }e
56e0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
56f0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
5700: 52 49 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RITE;.    }.  }.
5710: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5720: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
5730: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
5740: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
5750: 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
5760: 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
5770: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
5780: 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
5790: 20 6e 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20   nByte){.  LONG 
57a0: 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  upperBits = (LON
57b0: 47 29 28 28 6e 42 79 74 65 3e 3e 33 32 29 20 26  G)((nByte>>32) &
57c0: 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
57d0: 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 20 3d  LONG lowerBits =
57e0: 20 28 4c 4f 4e 47 29 28 6e 42 79 74 65 20 26 20   (LONG)(nByte & 
57f0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 44  0xffffffff);.  D
5800: 57 4f 52 44 20 64 77 52 65 74 3b 0a 20 20 77 69  WORD dwRet;.  wi
5810: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
5820: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
5830: 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 69 6e  WORD error;.  in
5840: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5850: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
5860: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
5870: 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
5880: 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
5890: 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69 6d 75   nByte));.  Simu
58a0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
58b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
58c0: 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 64 77 52  TRUNCATE);.  dwR
58d0: 65 74 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e  et = SetFilePoin
58e0: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
58f0: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
5900: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
5910: 3b 0a 20 20 69 66 28 20 64 77 52 65 74 3d 3d 49  ;.  if( dwRet==I
5920: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
5930: 50 4f 49 4e 54 45 52 20 26 26 20 28 65 72 72 6f  POINTER && (erro
5940: 72 3d 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  r=GetLastError()
5950: 29 21 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20  )!=NO_ERROR ){. 
5960: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
5970: 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 20 20 20  rno = error;.   
5980: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
5990: 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20 20 2f  RR_TRUNCATE;.  /
59a0: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 77  * SetEndOfFile w
59b0: 69 6c 6c 20 66 61 69 6c 20 69 66 20 6e 42 79 74  ill fail if nByt
59c0: 65 20 69 73 20 6e 65 67 61 74 69 76 65 20 2a 2f  e is negative */
59d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 53 65  .  }else if( !Se
59e0: 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65  tEndOfFile(pFile
59f0: 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ->h) ){.    pFil
5a00: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
5a10: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
5a20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
5a30: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b 0a 20  OERR_TRUNCATE;. 
5a40: 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
5a50: 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 20  RUNCATE %d %lld 
5a60: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
5a70: 20 6e 42 79 74 65 2c 20 72 63 3d 3d 53 51 4c 49   nByte, rc==SQLI
5a80: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
5a90: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
5aa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
5ab0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
5ac0: 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
5ad0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
5ae0: 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
5af0: 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
5b00: 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
5b10: 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
5b20: 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
5b30: 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
5b40: 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
5b50: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
5b60: 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
5b70: 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
5b80: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
5b90: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
5ba0: 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
5bb0: 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
5bc0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
5bd0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
5be0: 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
5bf0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
5c00: 20 66 6c 61 67 73 29 7b 0a 23 69 66 20 21 64 65   flags){.#if !de
5c10: 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
5c20: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5c30: 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 64 65 66  _NO_SYNC) || def
5c40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
5c50: 47 29 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  G).  winFile *pF
5c60: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
5c70: 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
5c80: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
5c90: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
5ca0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
5cb0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
5cc0: 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
5cd0: 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
5ce0: 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
5cf0: 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
5d00: 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
5d10: 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
5d20: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
5d30: 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
5d40: 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
5d50: 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64  "SYNC %d lock=%d
5d60: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
5d70: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
5d80: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
5d90: 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  E_TEST.  UNUSED_
5da0: 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
5db0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 66 6c  ;.#else.  if( fl
5dc0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 59 4e  ags & SQLITE_SYN
5dd0: 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  C_FULL ){.    sq
5de0: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
5df0: 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  ount++;.  }.  sq
5e00: 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
5e10: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
5e20: 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
5e30: 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
5e40: 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
5e50: 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
5e60: 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
5e70: 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
5e80: 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
5e90: 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
5ea0: 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
5eb0: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
5ec0: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
5ed0: 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 53 69 6d 75  E_FULL );.  Simu
5ee0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
5ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
5f00: 3b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ; );..  /* If we
5f10: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
5f20: 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
5f30: 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e  C flag, then syn
5f40: 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e  cing is a.  ** n
5f50: 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66  o-op.  */.#ifdef
5f60: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
5f70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5f80: 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  OK;.#else.  if( 
5f90: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
5fa0: 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
5fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5fc0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
5fd0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
5fe0: 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
5ff0: 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ();.    return S
6000: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
6010: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6020: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
6030: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
6040: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
6050: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6060: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
6070: 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
6080: 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  e3_int64 *pSize)
6090: 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72 42  {.  DWORD upperB
60a0: 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f 77  its;.  DWORD low
60b0: 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69 6c  erBits;.  winFil
60c0: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
60d0: 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
60e0: 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72   error;..  asser
60f0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
6100: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
6110: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
6120: 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65  R_FSTAT);.  lowe
6130: 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53  rBits = GetFileS
6140: 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75  ize(pFile->h, &u
6150: 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 66 28  pperBits);.  if(
6160: 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d     (lowerBits ==
6170: 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49   INVALID_FILE_SI
6180: 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 65 72  ZE).     && ((er
6190: 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
61a0: 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52 4f  or()) != NO_ERRO
61b0: 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70 46 69  R) ).  {.    pFi
61c0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
61d0: 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75 72  error;.    retur
61e0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
61f0: 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
6200: 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
6210: 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
6220: 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
6230: 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  s;.  return SQLI
6240: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6250: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
6260: 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
6270: 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
6280: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
6290: 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
62a0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
62b0: 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
62c0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
62d0: 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
62e0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
62f0: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
6300: 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
6310: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
6320: 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
6330: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
6340: 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35  this.** is Win95
6350: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
6360: 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
6370: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
6380: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
6390: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
63a0: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
63b0: 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ovlp;.    ovlp.O
63c0: 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f 46  ffset = SHARED_F
63d0: 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  IRST;.    ovlp.O
63e0: 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20  ffsetHigh = 0;. 
63f0: 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d     ovlp.hEvent =
6400: 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f   0;.    res = Lo
6410: 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e  ckFileEx(pFile->
6420: 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  h, LOCKFILE_FAIL
6430: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20 20  _IMMEDIATELY,.  
6440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6450: 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a     0, SHARED_SIZ
6460: 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f 2a  E, 0, &ovlp);./*
6470: 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
6480: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
6490: 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
64a0: 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
64b0: 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
64c0: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
64d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
64e0: 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lk;.    sqlite3_
64f0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
6500: 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
6510: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
6520: 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29  ckByte = (short)
6530: 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66  ((lk & 0x7ffffff
6540: 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
6550: 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  - 1));.    res =
6560: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
6570: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
6580: 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
6590: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
65a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
65b0: 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20  f( res == 0 ){. 
65c0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
65d0: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
65e0: 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  or();.  }.  retu
65f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
6600: 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
6610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
6620: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
6630: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
6640: 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20   int res;.  if( 
6650: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  isNT() ){.    re
6660: 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  s = UnlockFile(p
6670: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
6680: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
6690: 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73  _SIZE, 0);./* is
66a0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
66b0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
66c0: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
66d0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
66e0: 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f   .*/.#if SQLITE_
66f0: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
6700: 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  lse{.    res = U
6710: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
6720: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
6730: 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64   + pFile->shared
6740: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
6750: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  0);.#endif.  }. 
6760: 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
6770: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
6780: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
6790: 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65  rror();.  }.  re
67a0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
67b0: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
67c0: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
67d0: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
67e0: 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
67f0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
6800: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
6810: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
6820: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
6830: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
6840: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
6850: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
6860: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
6870: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
6880: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
6890: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
68a0: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
68b0: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
68c0: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
68d0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
68e0: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
68f0: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
6900: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
6910: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
6920: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
6930: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
6940: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
6950: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
6960: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
6970: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
6980: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
6990: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
69a0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
69b0: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
69c0: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
69d0: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
69e0: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
69f0: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
6a00: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
6a10: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
6a20: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
6a30: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
6a40: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
6a50: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
6a60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6a70: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
6a80: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68  ease a lock.  Th
6a90: 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f  e winUnlock() ro
6aa0: 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20  utine.** erases 
6ab0: 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63  all locks at onc
6ac0: 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73  e and returns us
6ad0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
6ae0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
6af0: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
6b00: 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20  ssible to lower 
6b10: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
6b20: 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20  l one step at a 
6b30: 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75  time.  You.** mu
6b40: 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74  st go straight t
6b50: 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
6b60: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
6b70: 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33   winLock(sqlite3
6b80: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
6b90: 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
6ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
6bb0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
6bc0: 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  e from subroutin
6bd0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  es */.  int res 
6be0: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
6bf0: 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77 69  * Result of a wi
6c00: 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20  ndows lock call 
6c10: 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b  */.  int newLock
6c20: 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  type;       /* S
6c30: 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  et pFile->lockty
6c40: 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  pe to this value
6c50: 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
6c60: 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64  */.  int gotPend
6c70: 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54  ingLock = 0;/* T
6c80: 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72  rue if we acquir
6c90: 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ed a PENDING loc
6ca0: 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20  k this time */. 
6cb0: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
6cc0: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
6cd0: 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20    DWORD error = 
6ce0: 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73  NO_ERROR;..  ass
6cf0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
6d00: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  OSTRACE(("LOCK %
6d10: 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
6d20: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
6d30: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
6d40: 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
6d50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
6d60: 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20  dLockByte));..  
6d70: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
6d80: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
6d90: 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
6da0: 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
6db0: 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
6dc0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
6dd0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
6de0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
6df0: 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
6e00: 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
6e10: 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
6e20: 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
6e30: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
6e40: 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
6e50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6e60: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
6e70: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
6e80: 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
6e90: 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
6ea0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
6eb0: 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
6ec0: 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
6ed0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
6ee0: 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
6ef0: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
6f00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
6f10: 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
6f20: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
6f30: 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
6f40: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  OCK );..  /* Loc
6f50: 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  k the PENDING_LO
6f60: 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65  CK byte if we ne
6f70: 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ed to acquire a 
6f80: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a  PENDING lock or.
6f90: 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f    ** a SHARED lo
6fa0: 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  ck.  If we are a
6fb0: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
6fc0: 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75  D lock, the acqu
6fd0: 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  isition of.  ** 
6fe0: 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
6ff0: 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61   byte is tempora
7000: 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f  ry..  */.  newLo
7010: 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e  cktype = pFile->
7020: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
7030: 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79    (pFile->lockty
7040: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20  pe==NO_LOCK).   
7050: 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79    || (   (lockty
7060: 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
7070: 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  CK).         && 
7080: 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
7090: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
70a0: 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
70b0: 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
70c0: 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
70d0: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
70e0: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
70f0: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
7100: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
7110: 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
7120: 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
7130: 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e 67  ck.  The pending
7140: 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a 20   lock might be. 
7150: 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79 20       ** held by 
7160: 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20 70  another reader p
7170: 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c 20  rocess who will 
7180: 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65 6e  release it momen
7190: 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  tarily..      */
71a0: 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
71b0: 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61  "could not get a
71c0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63   PENDING lock. c
71d0: 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b  nt=%d\n", cnt));
71e0: 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b  .      Sleep(1);
71f0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
7200: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
7210: 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
7220: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 47  .      error = G
7230: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
7240: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7250: 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
7260: 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
7270: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
7280: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
7290: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
72a0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
72b0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
72c0: 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  = getReadLock(pF
72d0: 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
72e0: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
72f0: 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
7300: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
7310: 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20 47  .      error = G
7320: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
7330: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7340: 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45  cquire a RESERVE
7350: 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  D lock.  */.  if
7360: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ( locktype==RESE
7370: 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73  RVED_LOCK && res
7380: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7390: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
73a0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
73b0: 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69      res = LockFi
73c0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
73d0: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
73e0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
73f0: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
7400: 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45  cktype = RESERVE
7410: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
7420: 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d  e{.      error =
7430: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
7440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7450: 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
7460: 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
7470: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
7480: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
7490: 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63  es ){.    newLoc
74a0: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
74b0: 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e  LOCK;.    gotPen
74c0: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
74d0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
74e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
74f0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
7500: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
7510: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
7520: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
7530: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  e->locktype>=SHA
7540: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
7550: 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64  res = unlockRead
7560: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
7570: 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65 61   OSTRACE(("unrea
7580: 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72  dlock = %d\n", r
7590: 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  es));.    res = 
75a0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
75b0: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
75c0: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
75d0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
75e0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
75f0: 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
7600: 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
7610: 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d  e{.      error =
7620: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
7630: 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
7640: 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64  "error-code = %d
7650: 5c 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20 20  \n", error));.  
7660: 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28      getReadLock(
7670: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
7680: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
7690: 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
76a0: 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
76b0: 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
76c0: 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
76d0: 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
76e0: 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
76f0: 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
7700: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
7710: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
7720: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
7730: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
7740: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55   0);.  }..  /* U
7750: 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
7760: 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
7770: 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
7780: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
7790: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
77a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
77b0: 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
77c0: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
77d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
77e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54    }else{.    OST
77f0: 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c  RACE(("LOCK FAIL
7800: 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72  ED %d trying for
7810: 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e   %d but got %d\n
7820: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
7830: 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65          locktype
7840: 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b  , newLocktype));
7850: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
7860: 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 20  Errno = error;. 
7870: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
7880: 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  USY;.  }.  pFile
7890: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
78a0: 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20  )newLocktype;.  
78b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
78c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
78d0: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
78e0: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
78f0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
7900: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
7910: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
7920: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
7930: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
7940: 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
7950: 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
7960: 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
7970: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
7980: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
7990: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
79a0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
79b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46    int rc;.  winF
79c0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
79d0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
79e0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
79f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7a00: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
7a10: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
7a20: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69  rt( id!=0 );.  i
7a30: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
7a40: 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
7a50: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  K ){.    rc = 1;
7a60: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
7a70: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
7a80: 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46  d (local)\n", pF
7a90: 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20  ile->h, rc));.  
7aa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
7ab0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
7ac0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
7ad0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
7ae0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
7af0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
7b00: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
7b10: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
7b20: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
7b30: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
7b40: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
7b50: 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
7b60: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
7b70: 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
7b80: 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
7b90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
7ba0: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
7bb0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
7bc0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
7bd0: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
7be0: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
7bf0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
7c00: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
7c10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
7c20: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
7c30: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
7c40: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
7c50: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
7c60: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
7c70: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
7c80: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
7c90: 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
7ca0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
7cb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
7cc0: 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
7cd0: 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
7ce0: 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
7cf0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7d00: 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
7d10: 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
7d20: 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
7d30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
7d40: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
7d50: 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
7d60: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
7d70: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
7d80: 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
7d90: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
7da0: 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
7db0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7dc0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
7dd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
7de0: 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
7df0: 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
7e00: 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
7e10: 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
7e20: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
7e30: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
7e40: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
7e50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
7e60: 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
7e70: 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
7e80: 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
7e90: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
7ea0: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
7eb0: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
7ec0: 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
7ed0: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
7ee0: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
7ef0: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67  HARED_LOCK && !g
7f00: 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
7f10: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
7f20: 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
7f30: 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75  happen.  We shou
7f40: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c  ld always be abl
7f50: 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  e to.      ** re
7f60: 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
7f70: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
7f80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
7f90: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  _UNLOCK;.    }. 
7fa0: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
7fb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
7fc0: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
7fd0: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
7fe0: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
7ff0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  ;.  }.  if( lock
8000: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  type==NO_LOCK &&
8010: 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f   type>=SHARED_LO
8020: 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  CK ){.    unlock
8030: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
8040: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
8050: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
8060: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
8070: 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
8080: 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
8090: 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
80a0: 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
80b0: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
80c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
80d0: 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
80e0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
80f0: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
8100: 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
8110: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
8120: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
8130: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
8140: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
8150: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
8160: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
8170: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
8180: 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  g = ((winFile*)i
8190: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  d)->locktype;.  
81a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
81b0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
81c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
81d0: 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
81e0: 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
81f0: 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  nt)((winFile*)id
8200: 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  )->lastErrno;.  
8210: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8220: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
8230: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
8240: 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
8250: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
8260: 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74 65  64 sz = *(sqlite
8270: 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20  3_int64*)pArg;. 
8280: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
8290: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
82a0: 20 20 20 20 20 77 69 6e 54 72 75 6e 63 61 74 65       winTruncate
82b0: 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  (id, sz);.      
82c0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
82d0: 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
82e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
82f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
8310: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
8320: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
8330: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
8340: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
8350: 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
8360: 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
8370: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
8380: 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
8390: 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
83a0: 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
83b0: 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
83c0: 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
83d0: 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
83e0: 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
83f0: 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
8400: 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
8410: 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
8420: 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
8430: 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
8440: 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
8450: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
8460: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
8470: 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
8480: 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
8490: 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
84a0: 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
84b0: 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
84c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
84d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  {.  assert( id!=
84e0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  0 );.  return (i
84f0: 6e 74 29 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  nt)(((winFile*)i
8500: 64 29 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  d)->sectorSize);
8510: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8520: 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76   a vector of dev
8530: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
8540: 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
8550: 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  nt winDeviceChar
8560: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
8570: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
8580: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8590: 52 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  R(id);.  return 
85a0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
85b0: 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
85c0: 45 4e 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  EN;.}..#ifndef S
85d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
85e0: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
85f0: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
8600: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
8610: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
8620: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
8630: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
8640: 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e   protect the win
8650: 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
8660: 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69   used by .** thi
8670: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
8680: 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72  hich may be shar
8690: 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
86a0: 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
86b0: 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74  nction winShmMut
86c0: 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
86d0: 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
86e0: 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
86f0: 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  ex .** is held w
8700: 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
8710: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
8720: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
8730: 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   of assert() .**
8740: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
8750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ..**.**   winShm
8760: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
8770: 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53      assert( winS
8780: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
8790: 0a 2a 2a 20 20 20 77 69 6e 45 6e 74 65 72 4c 65  .**   winEnterLe
87a0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
87b0: 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
87c0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
87d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
87e0: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
87f0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
8800: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
8810: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
8820: 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
8830: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
8840: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
8850: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
8860: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
8870: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
8880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8890: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
88a0: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
88b0: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
88c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
88d0: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
88e0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
88f0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
8900: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
8910: 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
8920: 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73  to represent a s
8930: 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65  ingle file opene
8940: 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f  d and mmapped to
8950: 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72   provide.** shar
8960: 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ed memory.  When
8970: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
8980: 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
8990: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d  the same.** log-
89a0: 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68  summary, each th
89b0: 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e  read has its own
89c0: 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c   winFile object,
89d0: 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a   but they all.**
89e0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
89f0: 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  le instance of t
8a00: 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  his object.  In 
8a10: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
8a20: 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  h.** log-summary
8a30: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20   is opened only 
8a40: 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
8a50: 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75  ..**.** winShmMu
8a60: 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
8a70: 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
8a80: 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
8a90: 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
8aa0: 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
8ab0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
8ac0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
8ad0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
8ae0: 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
8af0: 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
8b00: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
8b10: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
8b20: 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
8b30: 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
8b40: 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
8b50: 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
8b60: 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
8b70: 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
8b80: 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
8b90: 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
8ba0: 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
8bb0: 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
8bc0: 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
8bd0: 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
8be0: 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
8bf0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
8c00: 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
8c10: 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
8c20: 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
8c30: 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
8c40: 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
8c50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8c60: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8c70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8c80: 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
8c90: 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
8ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
8cb0: 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
8cc0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
8cd0: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
8ce0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
8cf0: 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
8d00: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
8d10: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
8d20: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
8d30: 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
8d40: 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
8d50: 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
8d60: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
8d70: 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
8d80: 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
8d90: 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
8da0: 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
8db0: 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
8dc0: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
8dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
8de0: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
8df0: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
8e00: 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
8e10: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8e20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8e30: 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
8e40: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
8e50: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
8e60: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
8e70: 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
8e80: 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
8e90: 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
8ea0: 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
8eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
8ec0: 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
8ed0: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
8ee0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
8ef0: 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
8f00: 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
8f10: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
8f20: 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
8f30: 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
8f40: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
8f50: 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
8f60: 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
8f70: 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
8f80: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
8f90: 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
8fa0: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
8fb0: 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
8fc0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
8fd0: 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
8fe0: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
8ff0: 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
9000: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
9010: 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
9020: 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
9030: 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
9040: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
9050: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
9060: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
9070: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
9080: 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
9090: 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
90a0: 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
90b0: 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
90c0: 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
90d0: 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
90e0: 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
90f0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
9100: 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
9110: 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
9120: 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
9130: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
9140: 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
9150: 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
9160: 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
9170: 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
9180: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
9190: 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
91a0: 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
91b0: 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
91c0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
91d0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
91e0: 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
91f0: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
9200: 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9220: 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
9230: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
9240: 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
9250: 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
9260: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
9270: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
9280: 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
9290: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
92a0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
92b0: 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
92c0: 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
92d0: 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
92e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92f0: 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
9300: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
9310: 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
9320: 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
9330: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
9340: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
9350: 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
9360: 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
9370: 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
9380: 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
9390: 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
93a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
93b0: 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
93c0: 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
93d0: 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
93e0: 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
93f0: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
9400: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
9410: 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
9420: 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
9430: 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
9440: 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
9450: 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
9460: 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
9470: 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
9480: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
9490: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
94a0: 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
94b0: 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
94c0: 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
94d0: 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
94e0: 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
94f0: 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
9500: 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
9510: 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
9520: 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
9530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
9540: 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
9550: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
9560: 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
9570: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
9580: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9590: 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
95a0: 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
95b0: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
95c0: 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
95d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  ;.  int rc = 0; 
95e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
95f0: 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
9600: 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
9610: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
9620: 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
9630: 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
9640: 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
9650: 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
9660: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9670: 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
9680: 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
9690: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
96a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
96b0: 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
96c0: 73 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d  s */.  dwFlags =
96d0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
96e0: 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69 66  MMEDIATELY;.  if
96f0: 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53  ( lockType == _S
9700: 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61  HM_WRLCK ) dwFla
9710: 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45  gs |= LOCKFILE_E
9720: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a  XCLUSIVE_LOCK;..
9730: 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
9740: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
9750: 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e 4f  PPED));.  ovlp.O
9760: 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a 20  ffset = ofst;.. 
9770: 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
9780: 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
9790: 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
97a0: 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
97b0: 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
97c0: 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  c = UnlockFileEx
97d0: 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  (pFile->hFile.h,
97e0: 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f   0, nByte, 0, &o
97f0: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
9800: 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65     rc = LockFile
9810: 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  Ex(pFile->hFile.
9820: 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e  h, dwFlags, 0, n
9830: 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  Byte, 0, &ovlp);
9840: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 28 72 63 21  .  }.  rc = (rc!
9850: 3d 30 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  =0) ? SQLITE_OK 
9860: 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a  : SQLITE_BUSY;..
9870: 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
9880: 4c 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78  LOCK %d %s %s 0x
9890: 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20  %08lx\n", .     
98a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
98b0: 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
98c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
98d0: 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
98e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  ,.           loc
98f0: 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
9900: 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45  K ? "UnlockFileE
9910: 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78  x" : "LockFileEx
9920: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 47 65  ",.           Ge
9930: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
9940: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9950: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
9960: 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
9970: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
9980: 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
9990: 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
99a0: 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
99b0: 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
99c0: 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
99d0: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
99e0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
99f0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
9a00: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
9a10: 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
9a20: 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
9a30: 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
9a40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
9a50: 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
9a60: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
9a70: 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
9a80: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
9a90: 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
9aa0: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
9ab0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9ac0: 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
9ad0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
9ae0: 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
9af0: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
9b00: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
9b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
9b20: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
9b30: 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
9b40: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
9b50: 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
9b60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
9b70: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
9b80: 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
9b90: 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
9ba0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
9bb0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
9bc0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
9bd0: 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
9be0: 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69     UnmapViewOfFi
9bf0: 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
9c00: 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
9c10: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
9c20: 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
9c30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9c40: 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d  f( p->hFile.h !=
9c50: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
9c60: 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20  VALUE ){.       
9c70: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
9c80: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
9c90: 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
9ca0: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
9cb0: 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  hFile);.        
9cc0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
9cd0: 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
9ce0: 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65  }.      if( dele
9cf0: 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  teFlag ){.      
9d00: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
9d10: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
9d20: 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
9d30: 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
9d40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 53 69  , 0);.        Si
9d50: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
9d60: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
9d70: 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
9d80: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
9d90: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
9da0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
9db0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
9dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
9dd0: 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
9de0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9df0: 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
9e00: 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
9e10: 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
9e20: 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
9e30: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
9e40: 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
9e50: 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
9e60: 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
9e70: 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
9e80: 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
9e90: 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
9ea0: 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
9eb0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
9ec0: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
9ed0: 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
9ee0: 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
9ef0: 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
9f00: 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
9f10: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
9f20: 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
9f30: 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
9f40: 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
9f50: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
9f60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
9f70: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
9f80: 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
9f90: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
9fa0: 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
9fb0: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
9fc0: 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
9fd0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
a000: 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
a010: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
a020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
a030: 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
a040: 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
a050: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a070: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
a080: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
a090: 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
a0a0: 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
a0b0: 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
a0c0: 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
a0d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
a0e0: 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
a0f0: 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
a100: 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
a110: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
a120: 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
a130: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
a140: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
a150: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
a160: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
a170: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
a180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a190: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
a1a0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
a1b0: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
a1c0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64  e3Strlen30(pDbFd
a1d0: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77  ->zPath);.  pNew
a1e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
a1f0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
a200: 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ode) + nName + 1
a210: 35 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  5 );.  if( pNew=
a220: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a230: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72  3_free(p);.    r
a240: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a250: 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
a260: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
a270: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77  (*pNew));.  pNew
a280: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
a290: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
a2a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
a2b0: 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77  f(nName+15, pNew
a2c0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ->zFilename, "%s
a2d0: 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
a2e0: 61 74 68 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ath);..  /* Look
a2f0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
a300: 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
a310: 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
a320: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
a330: 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
a340: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
a350: 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
a360: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
a370: 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
a380: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
a390: 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
a3a0: 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
a3b0: 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
a3c0: 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
a3d0: 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
a3e0: 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
a3f0: 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
a400: 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
a410: 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
a420: 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
a430: 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
a440: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
a450: 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
a460: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
a470: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
a480: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
a490: 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
a4a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a4b0: 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
a4c0: 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
a4d0: 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
a4e0: 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
a4f0: 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
a500: 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
a510: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
a520: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
a530: 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
a540: 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
a550: 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
a560: 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e  Node;..    pShmN
a570: 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
a580: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
a590: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
a5a0: 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
a5b0: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
a5c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
a5d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
a5e0: 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
a5f0: 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  err;.    }.    r
a600: 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46  c = winOpen(pDbF
a610: 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20  d->pVfs,.       
a620: 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
a630: 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  de->zFilename,  
a640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
a650: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
a660: 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20  UTF-8) */.      
a670: 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
a680: 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e  te3_file*)&pShmN
a690: 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20  ode->hFile,  /* 
a6a0: 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  File handle here
a6b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a6c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
a6d0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
a6e0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
a6f0: 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a   /* Mode flags *
a700: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a710: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53     0);.    if( S
a720: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
a730: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a740: 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
a750: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
a760: 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
a770: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
a780: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
a790: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
a7a0: 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
a7b0: 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
a7c0: 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
a7d0: 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
a7e0: 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
a7f0: 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
a800: 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
a810: 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
a820: 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
a830: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a840: 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
a850: 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
a860: 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
a870: 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
a880: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a890: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
a8a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
a8b0: 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20 7d  SHMOPEN;.      }
a8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a8d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a8e0: 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74        winShmSyst
a8f0: 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
a900: 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e   _SHM_UNLCK, WIN
a910: 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
a920: 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
a930: 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
a940: 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
a950: 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
a960: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a970: 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65  c ) goto shm_ope
a980: 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n_err;.  }..  /*
a990: 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
a9a0: 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
a9b0: 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   of the winShmNo
a9c0: 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
a9d0: 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
a9e0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
a9f0: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 23  mNode->pFirst;.#
aa00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
aa10: 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
aa20: 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
aa30: 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
aa40: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
aa50: 70 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  p;.  pShmNode->n
aa60: 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
aa70: 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
aa80: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
aa90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
aaa0: 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
aab0: 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
aac0: 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
aad0: 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  :.  winShmSystem
aae0: 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
aaf0: 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
ab00: 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69  HM_DMS, 1);.  wi
ab10: 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d  nShmPurge(pDbFd-
ab20: 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20  >pVfs, 0);      
ab30: 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
ab40: 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
ab50: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
ab60: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
ab70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
ab80: 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  w);.  winShmLeav
ab90: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
aba0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
abb0: 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
abc0: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
abd0: 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
abe0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
abf0: 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
ac00: 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
ac10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
ac20: 53 68 6d 43 6c 6f 73 65 28 0a 20 20 73 71 6c 69  ShmClose(.  sqli
ac30: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
ac40: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
ac50: 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
ac60: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
ac70: 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
ac80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
ac90: 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67  te after closing
aca0: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
acb0: 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
acc0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
acd0: 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
ace0: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d-memory */.  wi
acf0: 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
ad00: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
ad10: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
ad20: 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  ed */.  winShmNo
ad30: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
ad40: 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
ad50: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
ad60: 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  le */.  winShm *
ad70: 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
ad80: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
ad90: 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
ada0: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46  tions */..  pDbF
adb0: 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
adc0: 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
add0: 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
ade0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
adf0: 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
ae00: 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
ae10: 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
ae20: 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
ae30: 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
ae40: 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
ae50: 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
ae60: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
ae70: 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
ae80: 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
ae90: 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
aea0: 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
aeb0: 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
aec0: 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
aed0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
aee0: 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
aef0: 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
af00: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
af10: 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
af20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
af30: 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
af40: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
af50: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
af60: 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
af70: 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
af80: 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
af90: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
afa0: 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68  , too */.  winSh
afb0: 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
afc0: 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
afd0: 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
afe0: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
aff0: 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
b000: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
b010: 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
b020: 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46  d->pVfs, deleteF
b030: 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53  lag);.  }.  winS
b040: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
b050: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b060: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
b070: 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
b080: 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
b090: 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
b0a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b0b0: 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  inShmLock(.  sql
b0c0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
b0d0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
b0e0: 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
b0f0: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
b100: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
b110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b120: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
b130: 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
b140: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
b150: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
b160: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b170: 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
b180: 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
b190: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
b1c0: 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
b1d0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
b1e0: 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
b1f0: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  d;        /* Con
b200: 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
b210: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
b220: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
b230: 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
b240: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b250: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
b260: 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
b270: 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  winShm *pX;     
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
b2a0: 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
b2b0: 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53  blings */.  winS
b2c0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
b2d0: 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
b2e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b2f0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
b300: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
b310: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
b320: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
b350: 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
b360: 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
b370: 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
b380: 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
b390: 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
b3a0: 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
b3b0: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
b3c0: 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
b3d0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
b3e0: 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
b3f0: 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
b400: 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
b410: 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
b420: 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
b430: 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
b440: 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
b450: 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
b460: 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
b470: 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
b480: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
b490: 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
b4a0: 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
b4b0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
b4c0: 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
b4d0: 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55  mask = (u16)((1U
b4e0: 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
b4f0: 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73  U<<ofst));.  ass
b500: 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
b510: 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
b520: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
b530: 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
b540: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
b550: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
b560: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
b570: 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
b580: 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
b590: 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
b5a0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
b5b0: 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
b5c0: 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
b5d0: 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
b5e0: 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
b5f0: 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
b600: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
b610: 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
b620: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
b630: 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
b640: 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
b650: 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
b660: 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
b670: 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
b680: 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
b690: 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
b6a0: 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
b6b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
b6c0: 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
b6d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
b6e0: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
b6f0: 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
b700: 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
b710: 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
b720: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
b730: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b740: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
b750: 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
b760: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
b770: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b780: 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
b790: 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
b7a0: 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
b7b0: 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
b7c0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
b7d0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
b7e0: 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
b7f0: 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
b800: 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
b810: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
b820: 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
b830: 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
b840: 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
b850: 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
b860: 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
b870: 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
b880: 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
b890: 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
b8a0: 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
b8b0: 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
b8c0: 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
b8d0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
b8e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
b8f0: 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
b900: 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
b910: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
b920: 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
b930: 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
b940: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b950: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
b960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b970: 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
b980: 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
b990: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
b9a0: 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
b9b0: 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
b9c0: 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
b9d0: 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
b9e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b9f0: 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
ba00: 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
ba10: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ba20: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
ba30: 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
ba40: 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  RDLCK, ofst+WIN_
ba50: 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
ba60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba70: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ba80: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
ba90: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
baa0: 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
bab0: 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
bac0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bad0: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
bae0: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
baf0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
bb00: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
bb10: 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
bb20: 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
bb30: 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
bb40: 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
bb50: 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
bb60: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
bb70: 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
bb80: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
bb90: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
bba0: 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
bbb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
bbc0: 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
bbd0: 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
bbe0: 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
bbf0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
bc00: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
bc10: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bc20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bc30: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
bc40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
bc50: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
bc60: 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
bc70: 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
bc80: 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
bc90: 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
bca0: 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
bcb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
bcc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bcd0: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
bce0: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
bcf0: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
bd00: 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
bd10: 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
bd20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
bd40: 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
bd50: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
bd60: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
bd70: 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
bd80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
bd90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bda0: 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
bdb0: 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
bdc0: 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d  E(("SHM-LOCK shm
bdd0: 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f  id-%d, pid-%d go
bde0: 74 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e  t %03x,%03x %s\n
bdf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
be00: 3e 69 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72  >id, (int)GetCur
be10: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
be20: 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
be30: 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20  p->exclMask,.   
be40: 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66 61          rc ? "fa
be50: 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
be60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
be70: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
be80: 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
be90: 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
bea0: 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
beb0: 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
bec0: 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
bed0: 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
bee0: 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
bef0: 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
bf00: 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
bf10: 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
bf20: 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
bf30: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
bf40: 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
bf50: 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
bf60: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
bf70: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
bf80: 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
bf90: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
bfa0: 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d  ETER(fd);.  /* M
bfb0: 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
bfc0: 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
bfd0: 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
bfe0: 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
bff0: 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
c000: 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
c010: 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
c020: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c030: 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
c040: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
c050: 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
c060: 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
c070: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
c080: 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
c090: 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
c0a0: 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
c0b0: 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
c0c0: 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
c0d0: 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
c0e0: 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
c0f0: 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
c100: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
c110: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
c120: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
c130: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
c140: 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
c150: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
c160: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
c170: 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72   the isWrite par
c180: 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
c190: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
c1a0: 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
c1b0: 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
c1c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
c1d0: 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
c1e0: 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
c1f0: 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
c200: 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
c210: 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
c220: 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
c230: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
c240: 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20   .** isWrite is 
c250: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
c260: 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
c270: 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
c280: 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
c290: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
c2a0: 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
c2b0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
c2c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
c2d0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
c2e0: 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
c2f0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
c300: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
c310: 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
c320: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
c330: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
c340: 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
c350: 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
c360: 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
c370: 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
c380: 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
c390: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
c3a0: 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
c3b0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
c3c0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c3d0: 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28  c int winShmMap(
c3e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
c3f0: 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
c400: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
c410: 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
c420: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
c430: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
c440: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
c450: 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
c460: 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
c490: 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  gions */.  int i
c4a0: 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  sWrite,         
c4b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
c4c0: 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
c4d0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
c4e0: 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
c4f0: 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
c500: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
c510: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
c520: 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
c530: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
c540: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
c550: 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69  DbFd->pShm;.  wi
c560: 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
c570: 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
c580: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
c590: 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   !p ){.    rc = 
c5a0: 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
c5b0: 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
c5c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c5d0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
c5e0: 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53     p = pDbFd->pS
c5f0: 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f  hm;.  }.  pShmNo
c600: 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
c610: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
c620: 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
c630: 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
c640: 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
c650: 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
c660: 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
c670: 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
c680: 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
c690: 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
c6a0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d  {.    struct Shm
c6b0: 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20  Region *apNew;  
c6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
c6d0: 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  aRegion[] array 
c6e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
c6f0: 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
c700: 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
c710: 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
c720: 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
c730: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
c760: 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66  e of wal-index f
c770: 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  ile */..    pShm
c780: 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
c790: 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
c7a0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
c7b0: 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
c7c0: 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
c7d0: 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
c7e0: 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
c7f0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c800: 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
c810: 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
c820: 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
c830: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
c840: 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
c850: 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
c860: 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
c870: 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  /.    rc = winFi
c880: 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
c890: 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
c8a0: 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20  ->hFile, &sz);. 
c8b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c8c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
c8d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
c8e0: 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 67  SHMSIZE;.      g
c8f0: 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
c900: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
c910: 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  sz<nByte ){.    
c920: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
c930: 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
c940: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
c950: 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20 73   If isWrite is s
c960: 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a  et to.      ** z
c970: 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  ero, exit early.
c980: 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
c990: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
c9a0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
c9b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c9c0: 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  ** Alternatively
c9d0: 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73 20  , if isWrite is 
c9e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74  non-zero, use ft
c9f0: 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c  runcate() to all
ca00: 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  ocate.      ** t
ca10: 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
ca20: 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20  ory region..    
ca30: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
ca40: 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73  isWrite ) goto s
ca50: 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
ca60: 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
ca70: 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
ca80: 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
ca90: 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ile, nByte);.   
caa0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cab0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
cac0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
cad0: 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20  R_SHMSIZE;.     
cae0: 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
caf0: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
cb00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
cb10: 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
cb20: 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
cb30: 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
cb40: 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
cb50: 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
cb60: 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
cb70: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
cb80: 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
cb90: 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
cba0: 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
cbb0: 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
cbc0: 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
cbd0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
cbe0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
cbf0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
cc00: 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
cc10: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
cc20: 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
cc30: 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
cc40: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
cc50: 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
cc60: 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
cc70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
cc80: 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
cc90: 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
cca0: 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
ccb0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
ccc0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
ccd0: 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 68 4d  /.     .      hM
cce0: 61 70 20 3d 20 43 72 65 61 74 65 46 69 6c 65 4d  ap = CreateFileM
ccf0: 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64 65 2d  apping(pShmNode-
cd00: 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20  >hFile.h, .     
cd10: 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
cd20: 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
cd30: 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
cd40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
cd50: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 61  p ){.        pMa
cd60: 70 20 3d 20 4d 61 70 56 69 65 77 4f 66 46 69 6c  p = MapViewOfFil
cd70: 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
cd80: 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
cd90: 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
cda0: 20 20 20 20 30 2c 20 30 2c 20 6e 42 79 74 65 0a      0, 0, nByte.
cdb0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
cdc0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d   }.      if( !pM
cdd0: 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  ap ){.        pS
cde0: 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
cdf0: 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
ce00: 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ();.        rc =
ce10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
ce20: 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20         if( hMap 
ce30: 29 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d  ) CloseHandle(hM
ce40: 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ap);.        got
ce50: 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
ce60: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53       }..      pS
ce70: 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
ce80: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
ce90: 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a  n].pMap = pMap;.
cea0: 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
ceb0: 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
cec0: 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20  ->nRegion].hMap 
ced0: 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = hMap;.      pS
cee0: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
cef0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  +;.    }.  }..sh
cf00: 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
cf10: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
cf20: 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
cf30: 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
cf40: 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52  r *)pShmNode->aR
cf50: 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70  egion[iRegion].p
cf60: 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  Map;.    *pp = (
cf70: 76 6f 69 64 20 2a 29 26 70 5b 69 52 65 67 69 6f  void *)&p[iRegio
cf80: 6e 2a 73 7a 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d  n*szRegion];.  }
cf90: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
cfa0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
cfb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
cfc0: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
cfd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
cfe0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
cff0: 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  nShmMap     0.# 
d000: 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63  define winShmLoc
d010: 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
d020: 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a  winShmBarrier 0.
d030: 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 43  # define winShmC
d040: 6c 6f 73 65 20 20 20 30 0a 23 65 6e 64 69 66 20  lose   0.#endif 
d050: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
d060: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
d070: 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
d080: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
d090: 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
d0a0: 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
d0b0: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
d0c0: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
d0d0: 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
d0e0: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d100: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
d110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d150: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
d160: 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
d170: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
d180: 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
d190: 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
d1a0: 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
d1b0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
d1c0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
d1d0: 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
d1e0: 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  {.  2,          
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
d210: 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20  */.  winClose,  
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
d240: 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20  /.  winRead,    
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
d270: 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20    winWrite,     
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
d2a0: 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20   winTruncate,   
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
d2d0: 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20  .  winSync,     
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
d300: 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20   winFileSize,   
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
d330: 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20  .  winLock,     
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
d360: 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   winUnlock,     
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
d390: 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
d3a0: 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  dLock,          
d3b0: 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
d3c0: 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46  edLock */.  winF
d3d0: 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
d3f0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
d400: 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20   winSectorSize, 
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
d430: 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68  */.  winDeviceCh
d440: 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
d450: 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
d460: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
d470: 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20  /.  winShmMap,  
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
d4a0: 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
d4d0: 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
d4e0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
d4f0: 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
d500: 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 43  ier */.  winShmC
d510: 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
d520: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
d530: 43 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a  Close */.};../**
d540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
d590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5a0: 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
d5b0: 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
d5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d5d0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
d5e0: 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
d5f0: 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
d600: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
d610: 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
d620: 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
d630: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ..*/../*.** Conv
d640: 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
d650: 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
d660: 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
d670: 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
d680: 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
d690: 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
d6a0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d6b0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
d6c0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
d6d0: 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
d6e0: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
d6f0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
d700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d710: 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c   *convertUtf8Fil
d720: 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
d730: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
d740: 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
d750: 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54   = 0;.  if( isNT
d760: 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
d770: 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69  rted = utf8ToUni
d780: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
d790: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
d7a0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
d7b0: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
d7c0: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
d7d0: 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53  cuted. .*/.#if S
d7e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
d7f0: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  0.  }else{.    z
d800: 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38  Converted = utf8
d810: 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  ToMbcs(zFilename
d820: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
d830: 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
d840: 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
d850: 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
d860: 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
d870: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
d880: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
d890: 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
d8a0: 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
d8b0: 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61  ugh to.** hold a
d8c0: 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
d8d0: 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  me characters..*
d8e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
d8f0: 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
d900: 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
d910: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
d920: 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
d930: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
d940: 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
d950: 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
d960: 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
d970: 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
d980: 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68  ize_t i, j;.  ch
d990: 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58  ar zTempPath[MAX
d9a0: 5f 50 41 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20  _PATH+1];..  /* 
d9b0: 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
d9c0: 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
d9d0: 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
d9e0: 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
d9f0: 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
da00: 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
da10: 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
da20: 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
da30: 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
da40: 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
da50: 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
da60: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
da70: 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
da80: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d   if( sqlite3_tem
da90: 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
daa0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
dab0: 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
dac0: 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
dad0: 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
dae0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c  irectory);.  }el
daf0: 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  se if( isNT() ){
db00: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
db10: 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69  i;.    WCHAR zWi
db20: 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  dePath[MAX_PATH]
db30: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
db40: 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hW(MAX_PATH-30, 
db50: 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
db60: 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
db70: 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
db80: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
db90: 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
dba0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
dbb0: 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
dbc0: 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69  th, "%s", zMulti
dbd0: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4d  );.      free(zM
dbe0: 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ulti);.    }else
dbf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
dc00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
dc10: 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20   }./* isNT() is 
dc20: 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
dc30: 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
dc40: 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
dc50: 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
dc60: 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
dc70: 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
dc80: 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
dc90: 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
dca0: 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
dcb0: 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
dcc0: 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
dcd0: 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
dce0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
dcf0: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
dd00: 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
dd10: 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
dd20: 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
dd30: 20 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d    GetTempPathA(M
dd40: 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63  AX_PATH-30, zMbc
dd50: 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66  sPath);.    zUtf
dd60: 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  8 = sqlite3_win3
dd70: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
dd80: 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69  MbcsPath);.    i
dd90: 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
dda0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
ddb0: 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
ddc0: 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
ddd0: 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 66   zUtf8);.      f
dde0: 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
ddf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
de00: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
de10: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
de20: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
de30: 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
de40: 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
de50: 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
de60: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
de70: 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
de80: 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
de90: 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
dea0: 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53  .  if( (sqlite3S
deb0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
dec0: 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  h) + sqlite3Strl
ded0: 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
dee0: 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
def0: 31 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  17) >= nBuf ){. 
df00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
df10: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66  _ERROR;.  }..  f
df20: 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c  or(i=sqlite3Strl
df30: 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
df40: 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
df50: 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
df60: 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
df70: 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  [i] = 0;..  sqli
df80: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
df90: 66 2d 31 37 2c 20 7a 42 75 66 2c 0a 20 20 20 20  f-17, zBuf,.    
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
dfb0: 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50  %s\\"SQLITE_TEMP
dfc0: 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54  _FILE_PREFIX, zT
dfd0: 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
dfe0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
dff0: 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
e000: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
e010: 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
e020: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
e030: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
e040: 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
e050: 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
e060: 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
e070: 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
e080: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
e090: 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
e0a0: 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a  ("TEMP FILENAME:
e0b0: 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a   %s\n", zBuf));.
e0c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e0d0: 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK; .}../*.** Th
e0e0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
e0f0: 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  f getLastErrorMs
e100: 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  g.** is zero if 
e110: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
e120: 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
e130: 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
e140: 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
e150: 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
e160: 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a  as truncated)..*
e170: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
e180: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 69 6e 74  LastErrorMsg(int
e190: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
e1a0: 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d  f){.  /* FormatM
e1b0: 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30  essage returns 0
e1c0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74   on failure.  Ot
e1d0: 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20  herwise it.  ** 
e1e0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
e1f0: 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69  er of TCHARs wri
e200: 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
e210: 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  ut.  ** buffer, 
e220: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  excluding the te
e230: 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63  rminating null c
e240: 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52  har..  */.  DWOR
e250: 44 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73  D error = GetLas
e260: 74 45 72 72 6f 72 28 29 3b 0a 20 20 44 57 4f 52  tError();.  DWOR
e270: 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  D dwLen = 0;.  c
e280: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a  har *zOut = 0;..
e290: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
e2a0: 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70      WCHAR *zTemp
e2b0: 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
e2c0: 20 64 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d   dwLen = FormatM
e2d0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
e2e0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
e2f0: 42 55 46 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f  BUFFER | FORMAT_
e300: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
e310: 54 45 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53  TEM | FORMAT_MES
e320: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
e330: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20   error,.        
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70   (LPWSTR) &zTemp
e3c0: 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e400: 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  );.    if( dwLen
e410: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
e420: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
e430: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
e440: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
e450: 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
e460: 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b  Utf8(zTempWide);
e470: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
e480: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
e490: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
e4a0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
e4b0: 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a       LocalFree(z
e4c0: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d  TempWide);.    }
e4d0: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
e4e0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
e4f0: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
e500: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
e510: 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
e520: 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
e530: 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
e540: 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
e550: 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
e560: 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
e570: 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
e580: 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
e590: 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
e5a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
e5b0: 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
e5c0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
e5d0: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
e5e0: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28   FormatMessageA(
e5f0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
e600: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
e610: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
e620: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f  FROM_SYSTEM | FO
e630: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
e640: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a           error,.
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29           (LPSTR)
e6d0: 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20   &zTemp,.       
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77    0);.    if( dw
e720: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
e730: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
e740: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
e750: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
e760: 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
e770: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
e780: 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
e790: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
e7a0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
e7b0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
e7c0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
e7d0: 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70   LocalFree(zTemp
e7e0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
e7f0: 20 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20 64    }.  if( 0 == d
e800: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
e810: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e820: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
e830: 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 65 72  r 0x%x (%u)", er
e840: 72 6f 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d  ror, error);.  }
e850: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70  else{.    /* cop
e860: 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e  y a maximum of n
e870: 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74  Buf chars to out
e880: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
e890: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e8a0: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
e8b0: 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
e8c0: 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38  /* free the UTF8
e8d0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 66   buffer */.    f
e8e0: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
e8f0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
e900: 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
e910: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e920: 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
e930: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
e940: 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
e950: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e960: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
e970: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
e980: 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
e990: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
e9a0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
e9b0: 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
e9c0: 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
e9d0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e9f0: 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
ea00: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
ea10: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
ea20: 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
ea30: 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
ea40: 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
ea50: 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
ea60: 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
ea70: 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
ea80: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
ea90: 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
eaa0: 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
eab0: 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
eac0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
ead0: 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
eae0: 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
eaf0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
eb00: 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
eb10: 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
eb20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
eb30: 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f  ename in OS enco
eb40: 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ding */.  const 
eb50: 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20  char *zUtf8Name 
eb60: 3d 20 7a 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 46  = zName;    /* F
eb70: 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
eb80: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
eb90: 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
eba0: 5f 50 41 54 48 2b 31 5d 3b 20 20 20 20 20 20 20  _PATH+1];       
ebb0: 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
ebc0: 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20 66  to create temp f
ebd0: 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 61 73  ilename */..  as
ebe0: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
ebf0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
ec00: 52 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c  R(pVfs);..  pFil
ec10: 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
ec20: 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20  ANDLE_VALUE;..  
ec30: 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
ec40: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
ec50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
ec60: 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
ec70: 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
ec80: 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
ec90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
eca0: 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  f8Name ){.    in
ecb0: 74 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61  t rc = getTempna
ecc0: 6d 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a  me(MAX_PATH+1, z
ecd0: 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
ece0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ecf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ed00: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
ed10: 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
ed20: 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  me;.  }..  /* Co
ed30: 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
ed40: 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
ed50: 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
ed60: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
ed70: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
ed80: 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
ed90: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
eda0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
edb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
edc0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
edd0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
ede0: 57 52 49 54 45 20 29 7b 0a 20 20 20 20 64 77 44  WRITE ){.    dwD
edf0: 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
ee00: 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
ee10: 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
ee20: 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
ee30: 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
ee40: 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  RIC_READ;.  }.  
ee50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  /* SQLITE_OPEN_E
ee60: 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64  XCLUSIVE is used
ee70: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ee80: 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73  at a new file is
ee90: 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20   .  ** created. 
eea0: 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75  SQLite doesn't u
eeb0: 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74  se it to indicat
eec0: 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63  e "exclusive acc
eed0: 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74  ess" .  ** as it
eee0: 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65   is usually unde
eef0: 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 61  rstood..  */.  a
ef00: 73 73 65 72 74 28 21 28 66 6c 61 67 73 20 26 20  ssert(!(flags & 
ef10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
ef20: 55 53 49 56 45 29 20 7c 7c 20 28 66 6c 61 67 73  USIVE) || (flags
ef30: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
ef40: 52 45 41 54 45 29 29 3b 0a 20 20 69 66 28 20 66  REATE));.  if( f
ef50: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
ef60: 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  EN_EXCLUSIVE ){.
ef70: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
ef80: 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
ef90: 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
efa0: 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
efb0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
efc0: 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
efd0: 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
efe0: 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
eff0: 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
f000: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
f010: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
f020: 5f 43 52 45 41 54 45 20 29 7b 0a 20 20 20 20 2f  _CREATE ){.    /
f030: 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20  * Open existing 
f040: 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20  file, or create 
f050: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  if it doesn't ex
f060: 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ist */.    dwCre
f070: 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
f080: 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
f090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
f0a0: 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e  Opens a file, on
f0b0: 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ly if it exists.
f0c0: 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
f0d0: 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
f0e0: 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20  OPEN_EXISTING;. 
f0f0: 20 7d 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65   }.  dwShareMode
f100: 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
f110: 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
f120: 57 52 49 54 45 3b 0a 20 20 69 66 28 20 66 6c 61  WRITE;.  if( fla
f130: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
f140: 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
f150: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
f160: 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
f170: 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
f180: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
f190: 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
f1a0: 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
f1b0: 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
f1c0: 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
f1d0: 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
f1e0: 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
f210: 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
f240: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
f250: 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
f260: 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
f270: 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
f280: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
f290: 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
f2a0: 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
f2b0: 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
f2c0: 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
f2d0: 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
f2e0: 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
f2f0: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
f300: 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
f310: 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
f320: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
f330: 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
f340: 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
f350: 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
f360: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
f370: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d  sNT() ){.    h =
f380: 20 43 72 65 61 74 65 46 69 6c 65 57 28 28 57 43   CreateFileW((WC
f390: 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
f3a0: 0a 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65  .       dwDesire
f3b0: 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
f3c0: 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20  dwShareMode,.   
f3d0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
f3e0: 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
f3f0: 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64  sition,.       d
f400: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
f410: 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  tes,.       NULL
f420: 0a 20 20 20 20 29 3b 0a 2f 2a 20 69 73 4e 54 28  .    );./* isNT(
f430: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
f440: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
f450: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
f460: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
f470: 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
f480: 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
f490: 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
f4a0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
f4b0: 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
f4c0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
f4d0: 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
f4e0: 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
f4f0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
f500: 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
f510: 73 65 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61  se{.    h = Crea
f520: 74 65 46 69 6c 65 41 28 28 63 68 61 72 2a 29 7a  teFileA((char*)z
f530: 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
f540: 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
f550: 73 2c 0a 20 20 20 20 20 20 20 64 77 53 68 61 72  s,.       dwShar
f560: 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e 55  eMode,.       NU
f570: 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77 43 72 65  LL,.       dwCre
f580: 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
f590: 2c 0a 20 20 20 20 20 20 20 64 77 46 6c 61 67 73  ,.       dwFlags
f5a0: 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
f5b0: 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29        NULL.    )
f5c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f  ;.#endif.  }.  O
f5d0: 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  STRACE(("OPEN %d
f5e0: 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c   %s 0x%lx %s\n",
f5f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20   .           h, 
f600: 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  zName, dwDesired
f610: 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20  Access, .       
f620: 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48      h==INVALID_H
f630: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66  ANDLE_VALUE ? "f
f640: 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
f650: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
f660: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
f670: 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  {.    free(zConv
f680: 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20  erted);.    if( 
f690: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
f6a0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b  PEN_READWRITE ){
f6b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
f6c0: 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
f6d0: 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
f6e0: 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
f6f0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
f700: 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y)&~SQLITE_OPEN_
f710: 52 45 41 44 57 52 49 54 45 29 2c 20 70 4f 75 74  READWRITE), pOut
f720: 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
f730: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
f740: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
f750: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
f760: 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
f770: 29 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  ){.    if( flags
f780: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
f790: 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20 20  EADWRITE ){.    
f7a0: 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
f7b0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
f7c0: 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
f7d0: 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
f7e0: 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
f7f0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
f800: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 46 69    }.  memset(pFi
f810: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
f820: 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
f830: 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
f840: 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
f850: 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65  ->h = h;.  pFile
f860: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
f870: 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
f880: 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
f890: 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b  pFile->pShm = 0;
f8a0: 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
f8b0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c 65  = zName;.  pFile
f8c0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 67  ->sectorSize = g
f8d0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 56 66  etSectorSize(pVf
f8e0: 73 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 23  s, zUtf8Name);.#
f8f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
f900: 43 45 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  CE.  if( (flags 
f910: 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  & (SQLITE_OPEN_R
f920: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
f930: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 29 20 3d  OPEN_MAIN_DB)) =
f940: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
f950: 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
f960: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
f970: 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20  PEN_MAIN_DB).   
f980: 20 20 20 20 26 26 20 21 77 69 6e 63 65 43 72 65      && !winceCre
f990: 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70  ateLock(zName, p
f9a0: 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 43  File).  ){.    C
f9b0: 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20  loseHandle(h);. 
f9c0: 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
f9d0: 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ed);.    return 
f9e0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
f9f0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
fa00: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
fa10: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
fa20: 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
fa30: 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
fa40: 0a 20 20 7b 0a 20 20 20 20 66 72 65 65 28 7a 43  .  {.    free(zC
fa50: 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 20  onverted);.  }. 
fa60: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
fa70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fa80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
fa90: 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
faa0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
fab0: 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f   that windows do
fac0: 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
fad0: 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
fae0: 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
faf0: 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
fb00: 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
fb10: 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
fb20: 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
fb30: 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
fb40: 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
fb50: 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
fb60: 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
fb70: 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
fb80: 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
fb90: 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
fba0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
fbb0: 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
fbc0: 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
fbd0: 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
fbe0: 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
fbf0: 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
fc00: 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
fc10: 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
fc20: 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
fc30: 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
fc40: 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
fc50: 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
fc60: 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
fc70: 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
fc80: 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
fc90: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
fca0: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
fcb0: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
fcc0: 54 53 20 35 0a 73 74 61 74 69 63 20 69 6e 74 20  TS 5.static int 
fcd0: 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
fce0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
fcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
fd00: 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
fd10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fd20: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
fd30: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
fd40: 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
fd50: 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
fd60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
fd70: 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
fd80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
fd90: 20 30 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a   0;.  DWORD rc;.
fda0: 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20    DWORD error = 
fdb0: 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  0;.  void *zConv
fdc0: 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
fdd0: 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
fde0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
fdf0: 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20  TER(syncDir);.. 
fe00: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fe10: 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
fe20: 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
fe30: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
fe40: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
fe50: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
fe60: 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
fe70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fe80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
fe90: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
fea0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44  .    do{.      D
feb0: 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76  eleteFileW(zConv
fec0: 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69  erted);.    }whi
fed0: 6c 65 28 20 20 20 28 20 20 20 28 28 72 63 20 3d  le(   (   ((rc =
fee0: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
fef0: 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29  esW(zConverted))
ff00: 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   != INVALID_FILE
ff10: 5f 41 54 54 52 49 42 55 54 45 53 29 0a 20 20 20  _ATTRIBUTES).   
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
ff30: 28 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74  (error = GetLast
ff40: 45 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f  Error()) == ERRO
ff50: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29  R_ACCESS_DENIED)
ff60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
ff70: 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45  (++cnt < MX_DELE
ff80: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20  TION_ATTEMPTS). 
ff90: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 53 6c            && (Sl
ffa0: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
ffb0: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
ffc0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
ffd0: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
ffe0: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
fff0: 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
10000 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
10010 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
10020 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
10030 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
10040 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
10050 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
10060 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
10070 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
10080 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
10090 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
100a0 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65 74 65  do{.      Delete
100b0 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
100c0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 20  );.    }while(  
100d0 20 28 20 20 20 28 28 72 63 20 3d 20 47 65 74 46   (   ((rc = GetF
100e0 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
100f0 43 6f 6e 76 65 72 74 65 64 29 29 20 21 3d 20 49  Converted)) != I
10100 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
10110 49 42 55 54 45 53 29 0a 20 20 20 20 20 20 20 20  IBUTES).        
10120 20 20 20 20 20 20 20 7c 7c 20 28 28 65 72 72 6f         || ((erro
10130 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  r = GetLastError
10140 28 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41 43 43  ()) == ERROR_ACC
10150 45 53 53 5f 44 45 4e 49 45 44 29 29 0a 20 20 20  ESS_DENIED)).   
10160 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b 63 6e          && (++cn
10170 74 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f  t < MX_DELETION_
10180 41 54 54 45 4d 50 54 53 29 0a 20 20 20 20 20 20  ATTEMPTS).      
10190 20 20 20 20 20 26 26 20 28 53 6c 65 65 70 28 31       && (Sleep(1
101a0 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69  00), 1) );.#endi
101b0 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f  f.  }.  free(zCo
101c0 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
101d0 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25  ACE(("DELETE \"%
101e0 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65  s\" %s\n", zFile
101f0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 28 20 28  name,.       ( (
10200 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  rc==INVALID_FILE
10210 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20  _ATTRIBUTES) && 
10220 28 65 72 72 6f 72 3d 3d 45 52 52 4f 52 5f 46 49  (error==ERROR_FI
10230 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f  LE_NOT_FOUND)) ?
10240 0a 20 20 20 20 20 20 20 20 20 22 6f 6b 22 20 3a  .         "ok" :
10250 20 22 66 61 69 6c 65 64 22 20 29 29 3b 0a 20 0a   "failed" ));. .
10260 20 20 72 65 74 75 72 6e 20 28 20 20 20 28 72 63    return (   (rc
10270 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   == INVALID_FILE
10280 5f 41 54 54 52 49 42 55 54 45 53 29 20 0a 20 20  _ATTRIBUTES) .  
10290 20 20 20 20 20 20 20 20 26 26 20 28 65 72 72 6f          && (erro
102a0 72 20 3d 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f  r == ERROR_FILE_
102b0 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 20 53 51  NOT_FOUND)) ? SQ
102c0 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
102d0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d  _IOERR_DELETE;.}
102e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  ../*.** Check th
102f0 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20  e existance and 
10300 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65  status of a file
10310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10320 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c  winAccess(.  sql
10330 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
10340 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
10350 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
10360 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
10370 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
10380 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
10390 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
103a0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
103b0 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
103c0 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e   test to make on
103d0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
103e0 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20  int *pResOut    
103f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
10400 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a  T: Result */.){.
10410 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20    DWORD attr;.  
10420 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 76 6f  int rc = 0;.  vo
10430 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
10440 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10450 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
10460 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
10470 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10480 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a  R_ACCESS; );.  z
10490 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
104a0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
104b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
104c0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
104d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
104e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
104f0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
10500 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
10510 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
10520 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
10530 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
10540 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
10550 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 47  ata));.    if( G
10560 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
10570 45 78 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  ExW((WCHAR*)zCon
10580 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105a0 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
105b0 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20  foStandard, .   
105c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105d0 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
105e0 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 2f  Data) ){.      /
105f0 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
10600 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
10610 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
10620 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
10630 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
10640 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
10650 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10660 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
10670 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
10680 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
10690 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
106a0 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20  zeHigh==0 .     
106b0 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
106c0 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d  a.nFileSizeLow==
106d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  0 ){.        att
106e0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
106f0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
10700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10710 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
10720 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
10730 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tes;.      }.   
10740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
10750 28 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  ( GetLastError()
10760 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  !=ERROR_FILE_NOT
10770 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
10780 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
10790 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
107a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
107b0 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65  ACCESS;.      }e
107c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
107d0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
107e0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
107f0 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69 73     }.    }./* is
10800 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
10810 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
10820 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
10830 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
10840 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
10850 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
10860 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
10870 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
10880 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
10890 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
108a0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
108b0 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
108c0 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
108d0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
108e0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
108f0 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
10900 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
10910 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
10920 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76    }.  free(zConv
10930 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
10940 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
10950 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
10960 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
10970 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
10980 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
10990 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
109a0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
109b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
109c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
109d0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
109e0 20 20 20 20 20 20 72 63 20 3d 20 28 61 74 74 72        rc = (attr
109f0 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
10a00 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
10a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10a20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
10a30 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
10a40 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
10a50 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
10a60 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
10a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
10a80 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
10a90 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
10aa0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
10ab0 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ame.  Write the 
10ac0 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65  full.** pathname
10ad0 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a   into zOut[].  z
10ae0 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74  Out[] will be at
10af0 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50   least pVfs->mxP
10b00 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73  athname.** bytes
10b10 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
10b20 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50  tic int winFullP
10b30 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
10b40 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
10b50 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
10b60 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
10b70 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
10b80 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20  r *zRelative,   
10b90 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
10ba0 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
10bb0 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
10bc0 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
10bd0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10be0 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
10bf0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
10c00 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20  har *zFull      
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
10c30 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  .){.  .#if defin
10c40 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
10c50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
10c60 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
10c70 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45  ERROR );.  UNUSE
10c80 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
10c90 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e  l);.  cygwin_con
10ca0 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f  v_to_full_win32_
10cb0 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20  path(zRelative, 
10cc0 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zFull);.  return
10cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
10ce0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
10cf0 53 5f 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61  S_WINCE.  Simula
10d00 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
10d10 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
10d20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
10d30 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f  ETER(nFull);.  /
10d40 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
10d50 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
10d60 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
10d70 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
10d80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  */.  sqlite3_snp
10d90 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
10da0 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
10db0 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
10dc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10dd0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
10de0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
10df0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
10e00 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
10e10 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
10e20 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
10e30 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  r *zOut;..  /* I
10e40 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
10e50 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
10e60 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
10e70 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
10e80 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
10e90 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
10ea0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
10eb0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
10ec0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
10ed0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
10ee0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
10ef0 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
10f00 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
10f10 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
10f20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
10f30 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
10f40 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
10f50 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
10f60 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
10f70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
10f80 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65 72  Full);.  zConver
10f90 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
10fa0 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
10fb0 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73 4e 54  ive);.  if( isNT
10fc0 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20  () ){.    WCHAR 
10fd0 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
10fe0 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
10ff0 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  ameW((WCHAR*)zCo
11000 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
11010 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70  ) + 3;.    zTemp
11020 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
11030 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
11040 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
11050 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  mp==0 ){.      f
11060 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
11070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11080 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11090 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74  }.    GetFullPat
110a0 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a  hNameW((WCHAR*)z
110b0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
110c0 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
110d0 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
110e0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e  );.    zOut = un
110f0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
11100 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54 65  p);.    free(zTe
11110 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  mp);./* isNT() i
11120 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
11130 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
11140 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
11150 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
11160 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
11170 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
11180 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
11190 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
111a0 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
111b0 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
111c0 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
111d0 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
111e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
111f0 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
11200 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
11210 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65  ;.    nByte = Ge
11220 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
11230 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
11240 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a  , 0, 0, 0) + 3;.
11250 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c      zTemp = mall
11260 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
11270 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
11280 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
11290 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f  {.      free(zCo
112a0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
112b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
112c0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47  MEM;.    }.    G
112d0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
112e0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
112f0 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
11300 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43   0);.    free(zC
11310 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
11320 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
11330 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
11340 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65  (zTemp);.    fre
11350 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64 69 66  e(zTemp);.#endif
11360 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74 20  .  }.  if( zOut 
11370 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
11380 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78  nprintf(pVfs->mx
11390 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c  Pathname, zFull,
113a0 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
113b0 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20    free(zOut);.  
113c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113d0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
113e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
113f0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
11400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  .}../*.** Get th
11410 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  e sector size of
11420 20 74 68 65 20 64 65 76 69 63 65 20 75 73 65 64   the device used
11430 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 66 69 6c   to store.** fil
11440 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11450 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28 0a   getSectorSize(.
11460 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
11470 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e 73 74  *pVfs,.    const
11480 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
11490 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 66 69       /* UTF-8 fi
114a0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  le name */.){.  
114b0 44 57 4f 52 44 20 62 79 74 65 73 50 65 72 53 65  DWORD bytesPerSe
114c0 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44 45  ctor = SQLITE_DE
114d0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
114e0 45 3b 0a 20 20 2f 2a 20 47 65 74 44 69 73 6b 46  E;.  /* GetDiskF
114f0 72 65 65 53 70 61 63 65 20 69 73 20 6e 6f 74 20  reeSpace is not 
11500 73 75 70 70 6f 72 74 65 64 20 75 6e 64 65 72 20  supported under 
11510 57 49 4e 43 45 20 2a 2f 0a 23 69 66 20 53 51 4c  WINCE */.#if SQL
11520 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 55  ITE_OS_WINCE.  U
11530 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
11540 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
11550 50 41 52 41 4d 45 54 45 52 28 7a 52 65 6c 61 74  PARAMETER(zRelat
11560 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 68  ive);.#else.  ch
11570 61 72 20 7a 46 75 6c 6c 70 61 74 68 5b 4d 41 58  ar zFullpath[MAX
11580 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 6e 74 20  _PATH+1];.  int 
11590 72 63 3b 0a 20 20 44 57 4f 52 44 20 64 77 52 65  rc;.  DWORD dwRe
115a0 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64  t = 0;.  DWORD d
115b0 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a 20 20  wDummy;..  /*.  
115c0 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 67 65  ** We need to ge
115d0 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 20  t the full path 
115e0 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
115f0 0a 20 20 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  .  ** to get the
11600 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 74 6f   drive letter to
11610 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73 65 63   look up the sec
11620 74 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a 20  tor.  ** size.. 
11630 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
11640 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
11650 20 20 72 63 20 3d 20 77 69 6e 46 75 6c 6c 50 61    rc = winFullPa
11660 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 52 65  thname(pVfs, zRe
11670 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50 41 54 48  lative, MAX_PATH
11680 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20  , zFullpath);.  
11690 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
116a0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 69 66 28 20  enign(0);.  if( 
116b0 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  rc == SQLITE_OK 
116c0 29 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ).  {.    void *
116d0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
116e0 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
116f0 28 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20 20  (zFullpath);.   
11700 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 20   if( zConverted 
11710 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e  ){.      if( isN
11720 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  T() ){.        /
11730 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20 6a  * trim path to j
11740 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72 65  ust drive refere
11750 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 57  nce */.        W
11760 43 48 41 52 20 2a 70 20 3d 20 7a 43 6f 6e 76 65  CHAR *p = zConve
11770 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f  rted;.        fo
11780 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20  r(;*p;p++){.    
11790 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20        if( *p == 
117a0 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
117b0 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20      *p = '\0';. 
117c0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
117d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
117e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
117f0 64 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b 46  dwRet = GetDiskF
11800 72 65 65 53 70 61 63 65 57 28 28 57 43 48 41 52  reeSpaceW((WCHAR
11810 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20  &dwDummy,.      
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79 74              &byt
11870 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20  esPerSector,.   
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
118a0 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20  dwDummy,.       
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118c0 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
118d0 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mmy);.      }els
118e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72  e{.        /* tr
118f0 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20  im path to just 
11900 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  drive reference 
11910 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
11920 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 7a 43 6f  *p = (char *)zCo
11930 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20 20  nverted;.       
11940 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20   for(;*p;p++){. 
11950 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 20           if( *p 
11960 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  == '\\' ){.     
11970 20 20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30 27         *p = '\0'
11980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
11990 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
119a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
119b0 20 20 20 64 77 52 65 74 20 3d 20 47 65 74 44 69     dwRet = GetDi
119c0 73 6b 46 72 65 65 53 70 61 63 65 41 28 28 63 68  skFreeSpaceA((ch
119d0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  ar*)zConverted,.
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20    &dwDummy,.    
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62                &b
11a30 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20  ytesPerSector,. 
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20   &dwDummy,.     
11a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77               &dw
11a90 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d 0a  Dummy);.      }.
11aa0 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76        free(zConv
11ab0 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  erted);.    }.  
11ac0 20 20 69 66 28 20 21 64 77 52 65 74 20 29 7b 0a    if( !dwRet ){.
11ad0 20 20 20 20 20 20 62 79 74 65 73 50 65 72 53 65        bytesPerSe
11ae0 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44 45  ctor = SQLITE_DE
11af0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
11b00 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  E;.    }.  }.#en
11b10 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  dif.  return (in
11b20 74 29 20 62 79 74 65 73 50 65 72 53 65 63 74 6f  t) bytesPerSecto
11b30 72 3b 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  r; .}..#ifndef S
11b40 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
11b50 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
11b60 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
11b70 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
11b80 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
11b90 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
11ba0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
11bb0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
11bc0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
11bd0 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f  ed library..*/./
11be0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
11bf0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
11c00 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
11c10 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
11c20 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
11c30 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
11c40 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
11c50 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
11c60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11c70 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74  *winDlOpen(sqlit
11c80 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
11c90 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
11ca0 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ame){.  HANDLE h
11cb0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
11cc0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
11cd0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
11ce0 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
11cf0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
11d00 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
11d10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
11d20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
11d30 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20  isNT() ){.    h 
11d40 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28  = LoadLibraryW((
11d50 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
11d60 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73  d);./* isNT() is
11d70 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
11d80 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
11d90 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
11da0 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
11db0 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
11dc0 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
11dd0 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
11de0 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
11df0 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
11e00 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
11e10 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
11e20 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
11e30 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
11e40 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
11e50 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72      h = LoadLibr
11e60 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  aryA((char*)zCon
11e70 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
11e80 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76    }.  free(zConv
11e90 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  erted);.  return
11ea0 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61   (void*)h;.}.sta
11eb0 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72  tic void winDlEr
11ec0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
11ed0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
11ee0 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
11ef0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11f00 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74  TER(pVfs);.  get
11f10 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e 42 75  LastErrorMsg(nBu
11f20 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 76  f, zBufOut);.}.v
11f30 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
11f40 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
11f50 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c  , void *pHandle,
11f60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
11f70 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20  mbol))(void){.  
11f80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11f90 28 70 56 66 73 29 3b 0a 23 69 66 20 53 51 4c 49  (pVfs);.#if SQLI
11fa0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
11fb0 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72   The GetProcAddr
11fc0 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69  essA() routine i
11fd0 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
11fe0 20 6f 6e 20 77 69 6e 63 65 2e 20 2a 2f 0a 20 20   on wince. */.  
11ff0 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
12000 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64 64  void))GetProcAdd
12010 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48  ressA((HANDLE)pH
12020 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b  andle, zSymbol);
12030 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
12040 6f 74 68 65 72 20 77 69 6e 64 6f 77 73 20 70 6c  other windows pl
12050 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
12060 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
12070 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
12080 41 6e 73 69 20 73 74 72 69 6e 67 20 72 65 67 61  Ansi string rega
12090 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
120a0 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
120b0 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  /.  return (void
120c0 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72 6f  (*)(void))GetPro
120d0 63 41 64 64 72 65 73 73 28 28 48 41 4e 44 4c 45  cAddress((HANDLE
120e0 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f  )pHandle, zSymbo
120f0 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69  l);.#endif.}.voi
12100 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c  d winDlClose(sql
12110 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
12120 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
12130 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12140 45 52 28 70 56 66 73 29 3b 0a 20 20 46 72 65 65  ER(pVfs);.  Free
12150 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29  Library((HANDLE)
12160 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
12170 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
12180 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
12190 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
121a0 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  /.  #define winD
121b0 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
121c0 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a  ne winDlError 0.
121d0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53    #define winDlS
121e0 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
121f0 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65   winDlClose 0.#e
12200 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  ndif.../*.** Wri
12210 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79  te up to nBuf by
12220 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73  tes of randomnes
12230 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a  s into zBuf..*/.
12240 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61  static int winRa
12250 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
12260 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
12270 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
12280 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  ){.  int n = 0;.
12290 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
122a0 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65  ER(pVfs);.#if de
122b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
122c0 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20  T).  n = nBuf;. 
122d0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
122e0 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20   nBuf);.#else.  
122f0 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45  if( sizeof(SYSTE
12300 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29  MTIME)<=nBuf-n )
12310 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
12320 20 78 3b 0a 20 20 20 20 47 65 74 53 79 73 74 65   x;.    GetSyste
12330 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
12340 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
12350 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
12360 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
12370 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
12380 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
12390 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
123a0 20 70 69 64 20 3d 20 47 65 74 43 75 72 72 65 6e   pid = GetCurren
123b0 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
123c0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
123d0 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
123e0 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
123f0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
12400 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
12410 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
12420 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
12430 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a  GetTickCount();.
12440 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
12450 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
12460 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
12470 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
12480 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
12490 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
124a0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
124b0 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
124c0 20 20 20 51 75 65 72 79 50 65 72 66 6f 72 6d 61     QueryPerforma
124d0 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a  nceCounter(&i);.
124e0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
124f0 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28  [n], &i, sizeof(
12500 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  i));.    n += si
12510 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e  zeof(i);.  }.#en
12520 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  dif.  return n;.
12530 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
12540 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
12550 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
12560 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
12570 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
12580 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c  int winSleep(sql
12590 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
125a0 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20  int microsec){. 
125b0 20 53 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63   Sleep((microsec
125c0 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
125d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
125e0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
125f0 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
12600 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
12610 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
12620 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
12630 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
12640 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
12650 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
12660 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
12670 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
12680 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
12690 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
126a0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
126b0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
126c0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
126d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
126e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
126f0 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
12700 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
12710 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
12720 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
12730 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
12740 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
12750 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
12760 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
12770 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
12780 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
12790 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
127a0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
127b0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
127c0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
127d0 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
127e0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
127f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
12800 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
12810 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
12820 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
12830 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
12840 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
12850 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
12860 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
12870 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
12880 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
12890 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30  uccess, return 0
128a0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
128b0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
128c0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
128d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
128e0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
128f0 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
12900 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
12910 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
12920 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
12930 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
12940 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
12950 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
12960 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
12970 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
12980 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
12990 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
129a0 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
129b0 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
129c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
129d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
129e0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
129f0 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
12a00 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
12a10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
12a20 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
12a30 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
12a40 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
12a50 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
12a60 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
12a70 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
12a80 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
12a90 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
12aa0 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
12ab0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
12ac0 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
12ad0 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73  alue = .      (s
12ae0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
12af0 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74  0000000 + (sqlit
12b00 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
12b10 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
12b20 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a  nt64)294967296;.
12b30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
12b40 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
12b50 45 20 74 69 6d 65 3b 0a 20 20 47 65 74 53 79 73  E time;.  GetSys
12b60 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
12b70 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
12b80 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
12b90 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
12ba0 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
12bb0 21 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  !SystemTimeToFil
12bc0 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
12bd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
12be0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 47 65 74  .  }.#else.  Get
12bf0 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
12c00 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e  Time( &ft );.#en
12c10 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  dif..  *piNow = 
12c20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
12c30 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   +.            (
12c40 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
12c50 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
12c60 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75  me)*max32BitValu
12c70 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
12c80 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
12c90 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65  t64)ft.dwLowDate
12ca0 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69  Time)/(sqlite3_i
12cb0 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66  nt64)10000;..#if
12cc0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12cd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
12ce0 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
12cf0 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
12d00 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
12d10 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
12d20 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
12d30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
12d40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
12d50 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Vfs);.  return 0
12d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
12d70 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
12d80 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
12d90 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
12da0 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
12db0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
12dc0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
12dd0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
12de0 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
12df0 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
12e00 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
12e10 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
12e20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  be found..*/.int
12e30 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28   winCurrentTime(
12e40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12e50 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
12e60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12e70 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
12e80 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e    rc = winCurren
12e90 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c  tTimeInt64(pVfs,
12ea0 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20   &i);.  if( !rc 
12eb0 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
12ec0 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
12ed0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12ee0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61  ../*.** The idea
12ef0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
12f00 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b  nction works lik
12f10 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  e a combination 
12f20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  of.** GetLastErr
12f30 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d  or() and FormatM
12f40 65 73 73 61 67 65 28 29 20 6f 6e 20 77 69 6e 64  essage() on wind
12f50 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e  ows (or errno an
12f60 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  d.** strerror_r(
12f70 29 20 6f 6e 20 75 6e 69 78 29 2e 20 41 66 74 65  ) on unix). Afte
12f80 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  r an error is re
12f90 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a  turned by an OS.
12fa0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c  ** function, SQL
12fb0 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
12fc0 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75  unction with zBu
12fd0 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  f pointing to.**
12fe0 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75   a buffer of nBu
12ff0 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20  f bytes. The OS 
13000 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70  layer should pop
13010 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66  ulate the.** buf
13020 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74  fer with a nul-t
13030 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
13040 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65  encoded error me
13050 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62  ssage.** describ
13060 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20  ing the last IO 
13070 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63  error to have oc
13080 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68  curred within th
13090 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72  e calling.** thr
130a0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ead..**.** If th
130b0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
130c0 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  is too large for
130d0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
130e0 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  ffer,.** it shou
130f0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e  ld be truncated.
13100 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
13110 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72  e of xGetLastErr
13120 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  or.** is zero if
13130 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
13140 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
13150 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
13160 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
13170 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
13180 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20  was truncated). 
13190 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
131a0 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e  eturned,.** then
131b0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
131c0 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20  sary to include 
131d0 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
131e0 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  or character.** 
131f0 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
13200 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  ffer..**.** Not 
13210 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72  supplying an err
13220 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
13230 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20  have no adverse 
13240 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c  effect.** on SQL
13250 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20  ite. It is fine 
13260 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65  to have an imple
13270 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e  mentation that n
13280 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ever.** returns 
13290 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
132a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47  :.**.**   int xG
132b0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
132c0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
132d0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
132e0 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73  Buf){.**     ass
132f0 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30  ert(zBuf[0]=='\0
13300 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72  ');.**     retur
13310 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  n 0;.**   }.**.*
13320 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20  * However if an 
13330 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
13340 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69   supplied, it wi
13350 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74  ll be incorporat
13360 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20  ed.** by sqlite 
13370 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  into the error m
13380 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65  essage available
13390 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69   to the user usi
133a0 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72  ng.** sqlite3_er
133b0 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79  rmsg(), possibly
133c0 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72   making IO error
133d0 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75  s easier to debu
133e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
133f0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
13400 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
13410 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
13420 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
13430 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
13440 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  fs);.  return ge
13450 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e 42  tLastErrorMsg(nB
13460 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 0a 0a  uf, zBuf);.}....
13470 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
13480 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
13490 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
134a0 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
134b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
134c0 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
134d0 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
134e0 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
134f0 20 20 20 20 32 2c 20 20 20 20 20 20 20 20 20 20      2,          
13500 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
13510 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
13520 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
13530 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
13540 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20 20      MAX_PATH,   
13550 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61           /* mxPa
13560 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
13590 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20     "win32",     
135a0 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
135b0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
135d0 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
135e0 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
135f0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
13600 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
13610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
13620 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
13630 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
13640 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
13650 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
13660 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
13670 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
13680 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
13690 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
136a0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
136b0 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
136c0 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
136d0 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
136e0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
136f0 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
13700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
13710 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
13720 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
13730 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
13740 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
13750 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13760 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
13770 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
13780 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
13790 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
137a0 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
137b0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
137c0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
137d0 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
137e0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
137f0 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69   */.  };..  sqli
13800 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
13810 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20  (&winVfs, 1);.  
13820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13830 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  ; .}.int sqlite3
13840 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
13850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13860 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
13870 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
13880 2f 0a                                            /.