/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact ff0e14615a5086fa5ba6926e4ec0dc9cfb5a1a84:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f 6e 6c 79  for windows only
0210: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f   */.../*.** A No
0220: 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79 20  te About Memory 
0230: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  Allocation:.**.*
0240: 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75 73  * This driver us
0250: 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65  es malloc()/free
0260: 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74 68  () directly rath
0270: 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74 68  er than going th
0280: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51 4c  rough.** the SQL
0290: 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71 6c  ite-wrappers sql
02a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71  ite3_malloc()/sq
02b0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20 54  lite3_free().  T
02c0: 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a 2a  hose wrappers.**
02d0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66 6f   are designed fo
02e0: 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64 65  r use on embedde
02f0: 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  d systems where 
0300: 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63 65  memory is scarce
0310: 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66   and.** malloc f
0320: 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66  ailures happen f
0330: 72 65 71 75 65 6e 74 6c 79 2e 20 20 57 69 6e 33  requently.  Win3
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 64 65 73  n windows.** des
0710: 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74 20 73 6f  ktops but not so
0720: 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65   well in embedde
0730: 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23  d systems..*/..#
0740: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65  include <winbase
0750: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59  .h>..#ifdef __CY
0760: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0770: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0780: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0790: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74  cros used to det
07a0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
07b0: 72 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72  r not to use thr
07c0: 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  eads..*/.#if def
07d0: 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
07e0: 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23   && THREADSAFE.#
07f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0800: 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  32_THREADS 1.#en
0810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75  dif../*.** Inclu
0820: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0830: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0840: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0850: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0860: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  n.h"../*.** Some
0870: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
0880: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
0890: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
08a0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
08b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
08c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
08d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
08e0: 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64  (DWORD)-1) .#end
08f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  if../*.** Determ
0900: 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64 65  ine if we are de
0910: 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64 6f  aling with Windo
0920: 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61 73  wsCE - which has
0930: 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75 63   a much.** reduc
0940: 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  ed API..*/.#if S
0950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
0960: 20 64 65 66 69 6e 65 20 41 72 65 46 69 6c 65 41   define AreFileA
0970: 70 69 73 41 4e 53 49 28 29 20 31 0a 23 20 64 65  pisANSI() 1.# de
0980: 66 69 6e 65 20 46 6f 72 6d 61 74 4d 65 73 73 61  fine FormatMessa
0990: 67 65 57 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  geW(a,b,c,d,e,f,
09a0: 67 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  g) 0.#endif../* 
09b0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
09c0: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
09d0: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
09e0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
09f0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
0a00: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
0a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a20: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
0a30: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
0a40: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
0a50: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  memory */../*.**
0a60: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0a70: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0a80: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0a90: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0aa0: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0ab0: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
0ad0: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
0ae0: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
0af0: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
0b00: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
0b10: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
0b20: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
0b30: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
0b40: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0b50: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
0b80: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
0b90: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
0ba0: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
0bb0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0bc0: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
0bd0: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0be0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0bf0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0c00: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
0c10: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
0c20: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
0c30: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
0c40: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
0c50: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
0c60: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
0c70: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
0ca0: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
0cb0: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
0cc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0cd0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
0ce0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
0cf0: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
0d00: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
0d10: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
0d20: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
0d30: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
0d60: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
0d70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
0d80: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
0d90: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
0da0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0db0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0dc0: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0dd0: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0de0: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0df0: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0e00: 63 6b 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  ck */.  DWORD la
0e10: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
0e20: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
0e30: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
0e40: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
0e50: 20 20 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69    DWORD sectorSi
0e60: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ze;       /* Sec
0e70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
0e80: 64 65 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f  device file is o
0e90: 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  n */.  winShm *p
0ea0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
0eb0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
0ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
0ed0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
0ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0ef0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0f00: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0f10: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ile */.  int szC
0f20: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
0f30: 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63   /* Chunk size c
0f40: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
0f50: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
0f60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
0f70: 49 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44  INCE.  WCHAR *zD
0f80: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f  eleteOnClose;  /
0f90: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
0fa0: 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c  o delete when cl
0fb0: 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c  osing */.  HANDL
0fc0: 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20  E hMutex;       
0fd0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64     /* Mutex used
0fe0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
0ff0: 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63  ss to shared loc
1000: 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20  k */  .  HANDLE 
1010: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
1020: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
1030: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
1040: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
1050: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
1060: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
1070: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
1080: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
1090: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
10a0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
10b0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
10c0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
10d0: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
10e0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a  .#endif.};.../*.
10f0: 2a 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f  ** Forward proto
1100: 74 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  types..*/.static
1110: 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69   int getSectorSi
1120: 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ze(.    sqlite3_
1130: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63  vfs *pVfs,.    c
1140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
1150: 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d  tive     /* UTF-
1160: 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29  8 file name */.)
1170: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
1180: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
1190: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
11a0: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
11b0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
11c0: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
11d0: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
11e0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11f0: 20 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20   is Win95.** or 
1200: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
1210: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
1220: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
1230: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
1240: 73 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a  stem is Win95..*
1250: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
1260: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
1270: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
1280: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1290: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
12a0: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
12b0: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
12c0: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
12d0: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
12e0: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
12f0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
1300: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1310: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
1320: 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ype = 0;.#else.s
1330: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1340: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
1350: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1360: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
1370: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
1380: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
1390: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
13a0: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
13b0: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
13c0: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
13d0: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
13e0: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
13f0: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
1400: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
1410: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
1420: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
1430: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
1440: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
1450: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
1460: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
1470: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
1480: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
1490: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57  t when running W
14a0: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
14b0: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
14c0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
14d0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
14e0: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
14f0: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
1500: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
1510: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
1520: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
1530: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
1540: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
1550: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  x() API..*/.#if 
1560: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1570: 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20  # define isNT() 
1580: 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61   (1).#else.  sta
1590: 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69  tic int isNT(voi
15a0: 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  d){.    if( sqli
15b0: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29  te3_os_type==0 )
15c0: 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f  {.      OSVERSIO
15d0: 4e 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20  NINFO sInfo;.   
15e0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
15f0: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
1600: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
1610: 20 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45 78      GetVersionEx
1620: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (&sInfo);.      
1630: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
1640: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f  = sInfo.dwPlatfo
1650: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f  rmId==VER_PLATFO
1660: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20  RM_WIN32_NT ? 2 
1670: 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  : 1;.    }.    r
1680: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73  eturn sqlite3_os
1690: 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65  _type==2;.  }.#e
16a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16b0: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
16c0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
16d0: 38 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72  8 string to micr
16e0: 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55  osoft unicode (U
16f0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
1700: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
1710: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
1720: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
1730: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
1740: 61 74 69 63 20 57 43 48 41 52 20 2a 75 74 66 38  atic WCHAR *utf8
1750: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
1760: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1770: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
1780: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
1790: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
17a0: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
17b0: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
17c0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
17d0: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69   NULL, 0);.  zWi
17e0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c  deFilename = mal
17f0: 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f  loc( nChar*sizeo
1800: 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b  f(zWideFilename[
1810: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69  0]) );.  if( zWi
1820: 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  deFilename==0 ){
1830: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1840: 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c   }.  nChar = Mul
1850: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
1860: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
1870: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
1880: 65 46 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72  eFilename, nChar
1890: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
18a0: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 57  0 ){.    free(zW
18b0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
18c0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
18d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18e0: 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
18f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1900: 74 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63  t microsoft unic
1910: 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ode to UTF-8.  S
1920: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1930: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1940: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
1950: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  from malloc()..*
1960: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
1970: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e  nicodeToUtf8(con
1980: 73 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46  st WCHAR *zWideF
1990: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
19a0: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
19b0: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79  Filename;..  nBy
19c0: 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d  te = WideCharToM
19d0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
19e0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
19f0: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
1a00: 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65   0);.  zFilename
1a10: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
1a20: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
1a30: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1a40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
1a50: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1a60: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
1a70: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
1a80: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
1a90: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
1ac0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
1ad0: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69   ){.    free(zFi
1ae0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
1af0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
1b00: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
1b10: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
1b20: 76 65 72 74 20 61 6e 20 61 6e 73 69 20 73 74 72  vert an ansi str
1b30: 69 6e 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74  ing to microsoft
1b40: 20 75 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   unicode, based 
1b50: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
1b60: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
1b70: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
1b80: 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20  s..** .** Space 
1b90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
1ba0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
1bb0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
1bc0: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
1bd0: 63 20 57 43 48 41 52 20 2a 6d 62 63 73 54 6f 55  c WCHAR *mbcsToU
1be0: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
1bf0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
1c00: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 43   int nByte;.  WC
1c10: 48 41 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e 61  HAR *zMbcsFilena
1c20: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
1c30: 67 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73  ge = AreFileApis
1c40: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
1c50: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
1c60: 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65  Byte = MultiByte
1c70: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
1c80: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
1c90: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73  e, -1, NULL,0)*s
1ca0: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
1cb0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
1cc0: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
1cd0: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
1ce0: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
1cf0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
1d00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1d10: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
1d20: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
1d30: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
1d40: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
1d50: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e  zMbcsFilename, n
1d60: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
1d70: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65  te==0 ){.    fre
1d80: 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29  e(zMbcsFilename)
1d90: 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e  ;.    zMbcsFilen
1da0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
1db0: 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e  eturn zMbcsFilen
1dc0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
1dd0: 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20  nvert microsoft 
1de0: 75 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69  unicode to multi
1df0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
1e00: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
1e10: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 6e  the.** user's An
1e20: 73 69 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  si codepage..**.
1e30: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
1e40: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
1e50: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
1e60: 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28   from.** malloc(
1e70: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
1e80: 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73  r *unicodeToMbcs
1e90: 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57  (const WCHAR *zW
1ea0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
1eb0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
1ec0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1ed0: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41  int codepage = A
1ee0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
1ef0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
1f00: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
1f10: 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69   WideCharToMulti
1f20: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
1f30: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
1f40: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
1f50: 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ;.  zFilename = 
1f60: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
1f70: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1f80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1f90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
1fa0: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1fb0: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
1fc0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
1fd0: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
1fe0: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
2010: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
2020: 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65  {.    free(zFile
2030: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
2040: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
2050: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
2070: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
2080: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
2090: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
20a0: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
20b0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
20c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
20d0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
20e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
20f0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
2100: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2110: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
2120: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43  lenameUtf8;.  WC
2130: 48 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a  HAR *zTmpWide;..
2140: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63    zTmpWide = mbc
2150: 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  sToUnicode(zFile
2160: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
2170: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
2180: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2190: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20  zFilenameUtf8 = 
21a0: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
21b0: 6d 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28  mpWide);.  free(
21c0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
21d0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  urn zFilenameUtf
21e0: 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  8;.}../*.** Conv
21f0: 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c  ert UTF-8 to mul
2200: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
2210: 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20   string.  Space 
2220: 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20  to hold the .** 
2230: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
2240: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
2250: 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68   malloc()..*/.ch
2260: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
2270: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
2280: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2290: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
22a0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
22b0: 57 43 48 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b  WCHAR *zTmpWide;
22c0: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75  ..  zTmpWide = u
22d0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
22e0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
22f0: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
2300: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2310: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
2320: 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  = unicodeToMbcs(
2330: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 66 72 65  zTmpWide);.  fre
2340: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
2350: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d  eturn zFilenameM
2360: 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  bcs;.}.../*.** T
2370: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2380: 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  of getLastErrorM
2390: 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  sg.** is zero if
23a0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
23b0: 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
23c0: 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
23d0: 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
23e0: 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
23f0: 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  was truncated)..
2400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
2410: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 69 6e  tLastErrorMsg(in
2420: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2430: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
2440: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
2450: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
2460: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
2470: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2480: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
2490: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
24a0: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
24b0: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
24c0: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
24d0: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
24e0: 52 44 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61  RD error = GetLa
24f0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 44 57 4f  stError();.  DWO
2500: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
2510: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
2520: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
2530: 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d  .    WCHAR *zTem
2540: 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pWide = NULL;.  
2550: 20 20 64 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74    dwLen = Format
2560: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
2570: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
2580: 5f 42 55 46 46 45 52 20 7c 20 46 4f 52 4d 41 54  _BUFFER | FORMAT
2590: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
25a0: 53 54 45 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45  STEM | FORMAT_ME
25b0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
25c0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20    error,.       
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
2650: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
26a0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
26b0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
26c0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
26d0: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
26e0: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
26f0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
2700: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
2710: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
2720: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
2730: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
2740: 20 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28        LocalFree(
2750: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
2760: 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  }./* isNT() is 1
2770: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
2780: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
2790: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
27a0: 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
27b0: 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
27c0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
27d0: 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
27e0: 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
27f0: 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
2800: 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
2810: 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
2820: 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
2830: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2840: 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
2850: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20    char *zTemp = 
2860: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
2870: 3d 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  = FormatMessageA
2880: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
2890: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
28a0: 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  | FORMAT_MESSAGE
28b0: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46  _FROM_SYSTEM | F
28c0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
28d0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c            error,
2920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2930: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
2960: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
29b0: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
29c0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
29d0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
29e0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
29f0: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
2a00: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
2a10: 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
2a20: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
2a30: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
2a40: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
2a50: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
2a60: 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d    LocalFree(zTem
2a70: 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  p);.    }.#endif
2a80: 0a 20 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20  .  }.  if( 0 == 
2a90: 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  dwLen ){.    sql
2aa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2ab0: 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72  uf, zBuf, "OsErr
2ac0: 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 65  or 0x%x (%u)", e
2ad0: 72 72 6f 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20  rror, error);.  
2ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
2af0: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
2b00: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
2b10: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
2b20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2b30: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2b40: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
2b50: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
2b60: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
2b70: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a  free(zOut);.  }.
2b80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2b90: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
2ba0: 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72  ction - winLogEr
2bb0: 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73  rorAtLine() - is
2bc0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
2bd0: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
2be0: 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29  ** winLogError()
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2c00: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
2c10: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
2c20: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
2c30: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c  unction..** It l
2c40: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
2c50: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
2c60: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
2c70: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
2c80: 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  f.** error code 
2c90: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
2ca0: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
2cb0: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
2cc0: 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d  from .** FormatM
2cd0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
2ce0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2cf0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
2d00: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
2d10: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
2d20: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
2d30: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
2d40: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
2d50: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
2d60: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
2d70: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
2d80: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
2d90: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
2da0: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
2db0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
2dc0: 6c 65 64 20 61 6e 64 20 74 68 65 20 74 68 65 20  led and the the 
2dd0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
2de0: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
2df0: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
2e00: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
2e10: 63 29 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  c)     winLogErr
2e20: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
2e30: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
2e40: 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  int winLogErrorA
2e50: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
2e60: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
2e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
2e80: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
2e90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ea0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
2eb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
2ec0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
2ed0: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
2ee0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f00: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
2f10: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
2f20: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
2f50: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
2f60: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
2f70: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
2f80: 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
2f90: 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
2fa0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
2fb0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2fe0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 44 57 4f  counter */.  DWO
2ff0: 52 44 20 69 45 72 72 6e 6f 20 3d 20 47 65 74 4c  RD iErrno = GetL
3000: 61 73 74 45 72 72 6f 72 28 29 3b 20 20 2f 2a 20  astError();  /* 
3010: 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  Error code */.. 
3020: 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20   zMsg[0] = 0;.  
3030: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
3040: 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d  sizeof(zMsg), zM
3050: 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  sg);.  assert( e
3060: 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrcode!=SQLITE_O
3070: 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  K );.  if( zPath
3080: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
3090: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73  ;.  for(i=0; zMs
30a0: 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21  g[i] && zMsg[i]!
30b0: 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d  ='\r' && zMsg[i]
30c0: 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\n'; i++){}. 
30d0: 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20   zMsg[i] = 0;.  
30e0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
30f0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77  ode,.      "os_w
3100: 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73  in.c:%d: (%d) %s
3110: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
3120: 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c    iLine, iErrno,
3130: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
3140: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
3150: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 23  rn errcode;.}..#
3160: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3170: 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CE./************
3180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
31c0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f   This section co
31d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20  ntains code for 
31e0: 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f  WinCE only..*/./
31f0: 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64  *.** WindowsCE d
3200: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c  oes not have a l
3210: 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74  ocaltime() funct
3220: 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20  ion.  So create 
3230: 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e  a.** substitute.
3240: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .*/.#include <ti
3250: 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20  me.h>.struct tm 
3260: 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69  *__cdecl localti
3270: 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20  me(const time_t 
3280: 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73  *t).{.  static s
3290: 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49  truct tm y;.  FI
32a0: 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b  LETIME uTm, lTm;
32b0: 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54  .  SYSTEMTIME pT
32c0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  m;.  sqlite3_int
32d0: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
32e0: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
32f0: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
3300: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
3310: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
3320: 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78  (DWORD)(t64 & 0x
3330: 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d  FFFFFFFF);.  uTm
3340: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d  .dwHighDateTime=
3350: 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20   (DWORD)(t64 >> 
3360: 33 32 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54  32);.  FileTimeT
3370: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
3380: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c  uTm,&lTm);.  Fil
3390: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
33a0: 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20  e(&lTm,&pTm);.  
33b0: 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e  y.tm_year = pTm.
33c0: 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20  wYear - 1900;.  
33d0: 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77  y.tm_mon = pTm.w
33e0: 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74  Month - 1;.  y.t
33f0: 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_wday = pTm.wDa
3400: 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f  yOfWeek;.  y.tm_
3410: 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b  mday = pTm.wDay;
3420: 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70  .  y.tm_hour = p
3430: 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d  Tm.wHour;.  y.tm
3440: 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75  _min = pTm.wMinu
3450: 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d  te;.  y.tm_sec =
3460: 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20   pTm.wSecond;.  
3470: 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a  return &y;.}../*
3480: 20 54 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 72   This will never
3490: 20 62 65 20 63 61 6c 6c 65 64 2c 20 62 75 74 20   be called, but 
34a0: 64 65 66 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20  defined to make 
34b0: 74 68 65 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65  the code compile
34c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 54   */.#define GetT
34d0: 65 6d 70 50 61 74 68 41 28 61 2c 62 29 0a 0a 23  empPathA(a,b)..#
34e0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
34f0: 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20  a,b,c,d,e)      
3500: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
3510: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23  a, b, c, d, e).#
3520: 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c  define UnlockFil
3530: 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20  e(a,b,c,d,e)    
3540: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
3550: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29  (&a, b, c, d, e)
3560: 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c  .#define LockFil
3570: 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29  eEx(a,b,c,d,e,f)
3580: 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65     winceLockFile
3590: 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20  Ex(&a, b, c, d, 
35a0: 65 2c 20 66 29 0a 0a 23 64 65 66 69 6e 65 20 48  e, f)..#define H
35b0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
35c0: 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28  (a) (winFile*)&(
35d0: 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29  (char*)a)[-(int)
35e0: 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65  offsetof(winFile
35f0: 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ,h)]../*.** Acqu
3600: 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ire a lock on th
3610: 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74  e handle h.*/.st
3620: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d  atic void winceM
3630: 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44  utexAcquire(HAND
3640: 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20  LE h){.   DWORD 
3650: 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20  dwErr;.   do {. 
3660: 20 20 20 20 64 77 45 72 72 20 3d 20 57 61 69 74      dwErr = Wait
3670: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
3680: 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20  h, INFINITE);.  
3690: 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20   } while (dwErr 
36a0: 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  != WAIT_OBJECT_0
36b0: 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49   && dwErr != WAI
36c0: 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a  T_ABANDONED);.}.
36d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
36e0: 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79  lock acquired by
36f0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
3700: 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  re().*/.#define 
3710: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
3720: 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65  e(h) ReleaseMute
3730: 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  x(h)../*.** Crea
3740: 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  te the mutex and
3750: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75   shared memory u
3760: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
3770: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64  in the file.** d
3780: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a  escriptor pFile.
3790: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
37a0: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63  inceCreateLock(c
37b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
37c0: 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70  name, winFile *p
37d0: 46 69 6c 65 29 7b 0a 20 20 57 43 48 41 52 20 2a  File){.  WCHAR *
37e0: 7a 54 6f 6b 3b 0a 20 20 57 43 48 41 52 20 2a 7a  zTok;.  WCHAR *z
37f0: 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Name = utf8ToUni
3800: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
3810: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
3820: 54 52 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  TRUE;..  /* Init
3830: 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c  ialize the local
3840: 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 5a   lockdata */.  Z
3850: 65 72 6f 4d 65 6d 6f 72 79 28 26 70 46 69 6c 65  eroMemory(&pFile
3860: 2d 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f 66 28  ->local, sizeof(
3870: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
3880: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
3890: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
38a0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
38b0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
38c0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
38d0: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
38e0: 0a 20 20 7a 54 6f 6b 20 3d 20 43 68 61 72 4c 6f  .  zTok = CharLo
38f0: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
3900: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
3910: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
3920: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
3930: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
3940: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
3950: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
3960: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
3970: 20 3d 20 43 72 65 61 74 65 4d 75 74 65 78 57 28   = CreateMutexW(
3980: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
3990: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
39a0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
39b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
39c0: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
39d0: 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
39e0: 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
39f0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
3a00: 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
3a10: 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 6d 65 29  .    free(zName)
3a20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
3a30: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  SE;.  }..  /* Ac
3a40: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
3a50: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
3a60: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
3a70: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
3a80: 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a  hMutex);.  .  /*
3a90: 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
3aa0: 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
3ab0: 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
3ac0: 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
3ad0: 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d   are .  ** case-
3ae0: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
3af0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
3b00: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
3b10: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
3b20: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
3b30: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
3b40: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
3b50: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61 72 55  me..  */.  CharU
3b60: 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  pperW(zName);.  
3b70: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
3b80: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
3b90: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
3ba0: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44         PAGE_READ
3be0: 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66  WRITE, 0, sizeof
3bf0: 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20  (winceLock),.   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20      zName);  .. 
3c30: 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74   /* Set a flag t
3c40: 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77 65  hat indicates we
3c50: 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74 6f  're the first to
3c60: 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f   create the memo
3c70: 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d  ry so it .  ** m
3c80: 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
3c90: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20  ialized */.  if 
3ca0: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  (GetLastError() 
3cb0: 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59  == ERROR_ALREADY
3cc0: 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49  _EXISTS){.    bI
3cd0: 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d  nit = FALSE;.  }
3ce0: 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b  ..  free(zName);
3cf0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
3d00: 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
3d10: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
3d20: 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
3d30: 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  t. */.  if (pFil
3d40: 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20  e->hShared){.   
3d50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
3d60: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 4d 61 70   (winceLock*)Map
3d70: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
3d80: 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20  ->hShared, .    
3d90: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41           FILE_MA
3da0: 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f  P_READ|FILE_MAP_
3db0: 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a  WRITE, 0, 0, siz
3dc0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
3dd0: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69  .    /* If mappi
3de0: 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65  ng failed, close
3df0: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
3e00: 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72  ry handle and er
3e10: 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ase it */.    if
3e20: 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64   (!pFile->shared
3e30: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3e40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
3e50: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
3e60: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
3e70: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 77 69 6e  LITE_ERROR, "win
3e80: 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20  ceCreateLock2", 
3e90: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
3ea0: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
3eb0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
3ec0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
3ed0: 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
3ee0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
3ef0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
3f00: 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
3f10: 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
3f20: 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
3f30: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
3f40: 3e 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c  >hShared == NULL
3f50: 29 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  ){.    winceMute
3f60: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
3f70: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 43 6c 6f  hMutex);.    Clo
3f80: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
3f90: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
3fa0: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
3fb0: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
3fc0: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
3fd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3fe0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
3ff0: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
4000: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
4010: 74 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d 65 6d  t) {.    ZeroMem
4020: 6f 72 79 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  ory(pFile->share
4030: 64 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  d, sizeof(winceL
4040: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
4050: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
4060: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
4070: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d    return TRUE;.}
4080: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
4090: 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
40a0: 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
40b0: 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
40c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
40d0: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
40e0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
40f0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
4100: 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
4110: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
4120: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
4130: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
4140: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
4150: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
4160: 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
4170: 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
4180: 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
4190: 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
41a0: 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
41b0: 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
41c0: 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
41d0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
41e0: 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
41f0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
4200: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
4210: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
4220: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
4230: 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
4240: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
4250: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
4260: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
4270: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
4280: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
4290: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
42a0: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
42b0: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
42c0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
42d0: 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
42e0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
42f0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
4300: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
4310: 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
4320: 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
4330: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
4340: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 55 6e  handle */.    Un
4350: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
4360: 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20  ile->shared);.  
4370: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
4380: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
4390: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
43a0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
43b0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
43c0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
43d0: 78 29 3b 20 20 20 20 0a 20 20 20 20 43 6c 6f 73  x);    .    Clos
43e0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
43f0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
4400: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
4410: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
4420: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
4430: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
4440: 65 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64 6f  e() API of windo
4450: 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a  ws for wince.*/.
4460: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
4470: 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e  eLockFile(.  HAN
4480: 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44  DLE *phFile,.  D
4490: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
44a0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
44b0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
44c0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
44d0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
44e0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
44f0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
4500: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
4510: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
4520: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
4530: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
4540: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
4550: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
4560: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
4570: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
4580: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
4590: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
45a0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
45b0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
45c0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
45d0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
45e0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
45f0: 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
4600: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
4610: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
4620: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
4630: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
4640: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
4650: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
4660: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
4670: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
4680: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
4690: 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
46a0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
46b0: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
46c0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
46d0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
46e0: 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
46f0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
4700: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
4710: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
4720: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
4730: 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
4740: 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
4750: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
4760: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
4770: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
4780: 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
4790: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
47a0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
47b0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
47c0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
47d0: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
47e0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
47f0: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
4800: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
4810: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
4820: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
4830: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
4840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
4850: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
4860: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
4870: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
4880: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
4890: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
48a0: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
48b0: 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62  NG_BYTE && nNumb
48c0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
48d0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
48e0: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
48f0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
4900: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
4910: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
4920: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
4930: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
4940: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
4950: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
4960: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
4970: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
4980: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
4990: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
49a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
49b0: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
49c0: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
49d0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
49e0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
49f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
4a00: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
4a10: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
4a20: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
4a30: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
4a40: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
4a50: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
4a60: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
4a70: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
4a80: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54  al.bReserved = T
4a90: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
4aa0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
4ab0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
4ac0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
4ad0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
4ae0: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
4af0: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
4b00: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e  tation of the Un
4b10: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20  lockFile API of 
4b20: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
4b30: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
4b40: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
4b50: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
4b60: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
4b70: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
4b80: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
4b90: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
4ba0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
4bb0: 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
4bc0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
4bd0: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
4be0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
4bf0: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
4c00: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
4c10: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
4c20: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
4c30: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
4c40: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
4c50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
4c60: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
4c70: 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
4c80: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
4c90: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
4ca0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
4cb0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
4cc0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
4cd0: 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
4ce0: 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
4cf0: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
4d00: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
4d10: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
4d20: 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
4d30: 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
4d40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
4d50: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
4d60: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
4d70: 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
4d80: 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
4d90: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
4da0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
4db0: 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
4dc0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
4dd0: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
4de0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
4df0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
4e00: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
4e10: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
4e20: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
4e30: 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
4e40: 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
4e50: 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
4e60: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
4e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
4e80: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
4e90: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
4ea0: 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20  )SHARED_SIZE || 
4eb0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
4ec0: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
4ed0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
4ee0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
4ef0: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
4f00: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
4f10: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
4f20: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
4f30: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
4f40: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
4f50: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
4f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
4f70: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
4f80: 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
4f90: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
4fa0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
4fb0: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
4fc0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
4fd0: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
4fe0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
4ff0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
5000: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
5010: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
5020: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
5030: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
5040: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
5050: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
5060: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
5070: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
5080: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
5090: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
50a0: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
50b0: 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
50c0: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
50d0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
50e0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
50f0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
5100: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
5110: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
5120: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
5130: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
5140: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
5150: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
5160: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
5170: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
5180: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
5190: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
51a0: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
51b0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
51c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
51d0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
51e0: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
51f0: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
5200: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
5210: 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c 45 20  ileEx(.  HANDLE 
5220: 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44  *phFile,.  DWORD
5230: 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57 4f 52   dwFlags,.  DWOR
5240: 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a 20 20  D dwReserved,.  
5250: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
5260: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20  ytesToLockLow,. 
5270: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
5280: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 2c  BytesToLockHigh,
5290: 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 20  .  LPOVERLAPPED 
52a0: 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29 7b 0a  lpOverlapped.){.
52b0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
52c0: 45 52 28 64 77 52 65 73 65 72 76 65 64 29 3b 0a  ER(dwReserved);.
52d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
52e0: 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
52f0: 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  sToLockHigh);.. 
5300: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
5310: 72 20 77 61 6e 74 73 20 61 20 73 68 61 72 65 64  r wants a shared
5320: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f 72 77   read lock, forw
5330: 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a 20 20  ard this call.  
5340: 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63 6b 46  ** to winceLockF
5350: 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c 70 4f  ile */.  if (lpO
5360: 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66 73 65  verlapped->Offse
5370: 74 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  t == (DWORD)SHAR
5380: 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20  ED_FIRST &&.    
5390: 20 20 64 77 46 6c 61 67 73 20 3d 3d 20 31 20 26    dwFlags == 1 &
53a0: 26 0a 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f  &.      nNumberO
53b0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
53c0: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
53d0: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72 65 74 75  _SIZE){.    retu
53e0: 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  rn winceLockFile
53f0: 28 70 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  (phFile, SHARED_
5400: 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
5410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
5420: 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  LSE;.}./*.** End
5430: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
5440: 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
5450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
54a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
54b0: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a  S_WINCE */../***
54c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
5510: 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20  e next group of 
5520: 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65  routines impleme
5530: 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  nt the I/O metho
5540: 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ds specified.** 
5550: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  by the sqlite3_i
5560: 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
5570: 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
5580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69  /../*.** Some mi
55d0: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
55e0: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
55f0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
5600: 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ef INVALID_SET_F
5610: 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65  ILE_POINTER.# de
5620: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54  fine INVALID_SET
5630: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28  _FILE_POINTER ((
5640: 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66  DWORD)-1).#endif
5650: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
5660: 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
5670: 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  n of the file ha
5680: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
5690: 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
56a0: 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20  ument to offset 
56b0: 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74  iOffset within t
56c0: 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  he file. If succ
56d0: 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30  essful, return 0
56e0: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
56f0: 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74   set pFile->last
5700: 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e  Errno and return
5710: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
5720: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69 6e  atic int seekWin
5730: 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  File(winFile *pF
5740: 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ile, sqlite3_int
5750: 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 20 20 4c  64 iOffset){.  L
5760: 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20  ONG upperBits;  
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5780: 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62  * Most sig. 32 b
5790: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
57a0: 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  t */.  LONG lowe
57b0: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
57c0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20         /* Least 
57d0: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
57e0: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
57f0: 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20  DWORD dwRet;    
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
5820: 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
5830: 74 65 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65  ter() */..  uppe
5840: 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
5850: 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
5860: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
5870: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
5880: 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
5890: 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
58a0: 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
58b0: 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
58c0: 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
58d0: 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
58e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
58f0: 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
5900: 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
5910: 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
5920: 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
5930: 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
5940: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
5950: 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
5960: 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
5970: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
5980: 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
5990: 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
59a0: 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
59b0: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
59c0: 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
59d0: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
59e0: 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  cured, it is als
59f0: 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
5a00: 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
5a10: 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
5a20: 20 64 77 52 65 74 20 3d 20 53 65 74 46 69 6c 65   dwRet = SetFile
5a30: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68  Pointer(pFile->h
5a40: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
5a50: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
5a60: 47 49 4e 29 3b 0a 20 20 69 66 28 20 28 64 77 52  GIN);.  if( (dwR
5a70: 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  et==INVALID_SET_
5a80: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20  FILE_POINTER && 
5a90: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
5aa0: 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20  NO_ERROR) ){.   
5ab0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
5ac0: 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
5ad0: 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
5ae0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
5af0: 5f 53 45 45 4b 2c 20 22 73 65 65 6b 57 69 6e 46  _SEEK, "seekWinF
5b00: 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ile", pFile->zPa
5b10: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  th);.    return 
5b20: 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
5b30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
5b40: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
5b50: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
5b60: 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
5b70: 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
5b80: 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
5b90: 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
5ba0: 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
5bb0: 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
5bc0: 62 75 74 20 77 69 6e 64 6f 77 73 20 69 73 20 6e  but windows is n
5bd0: 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
5be0: 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
5bf0: 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
5c00: 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
5c10: 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
5c20: 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
5c30: 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
5c40: 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
5c50: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
5c60: 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
5c70: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
5c80: 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
5c90: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
5ca0: 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
5cb0: 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
5cc0: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
5cd0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
5ce0: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
5cf0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
5d00: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
5d10: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
5d20: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
5d30: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
5d40: 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
5d50: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
5d60: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
5d70: 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  pShm==0 );.  OST
5d80: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
5d90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
5da0: 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 43    do{.    rc = C
5db0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
5dc0: 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
5dd0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
5de0: 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
5df0: 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
5e00: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
5e10: 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
5e20: 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
5e30: 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  Sleep(100), 1) )
5e40: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
5e50: 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49  WINCE.#define WI
5e60: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
5e70: 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44  EMPTS 3.  winceD
5e80: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
5e90: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
5ea0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
5eb0: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
5ec0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
5ed0: 20 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46           DeleteF
5ee0: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
5ef0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
5f00: 20 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c         && GetFil
5f10: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
5f20: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
5f30: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
5f40: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
5f50: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
5f60: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
5f70: 29 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28  ){.       Sleep(
5f80: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
5f90: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
5fa0: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
5fb0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46     }.    free(pF
5fc0: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
5fd0: 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ose);.  }.#endif
5fe0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
5ff0: 53 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  SE %d %s\n", pFi
6000: 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
6010: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
6020: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
6030: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
6040: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
6050: 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72        : winLogEr
6060: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
6070: 5f 43 4c 4f 53 45 2c 20 22 77 69 6e 43 6c 6f 73  _CLOSE, "winClos
6080: 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
6090: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
60a0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
60b0: 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
60c0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
60d0: 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
60e0: 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
60f0: 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
6100: 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
6110: 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
6120: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
6130: 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
6140: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
6150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
6160: 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
6170: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6190: 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
61a0: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
61b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
61e0: 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
61f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
6200: 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
6210: 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
6220: 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
6230: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
6240: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
6250: 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64  d;  /* file hand
6260: 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52  le */.  DWORD nR
6270: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
6280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6290: 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
62a0: 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69  lly read from fi
62b0: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
62c0: 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75   id!=0 );.  Simu
62d0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
62e0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
62f0: 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45  READ);.  OSTRACE
6300: 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d  (("READ %d lock=
6310: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
6320: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
6330: 29 29 3b 0a 0a 20 20 69 66 28 20 73 65 65 6b 57  ));..  if( seekW
6340: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  inFile(pFile, of
6350: 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
6360: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
6370: 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 61 64  .  }.  if( !Read
6380: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
6390: 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64  Buf, amt, &nRead
63a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  , 0) ){.    pFil
63b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
63c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
63d0: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
63e0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
63f0: 52 52 5f 52 45 41 44 2c 20 22 77 69 6e 52 65 61  RR_READ, "winRea
6400: 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
6410: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  );.  }.  if( nRe
6420: 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
6430: 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
6440: 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
6450: 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
6460: 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
6470: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
6480: 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
6490: 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72  mt-nRead);.    r
64a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
64b0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
64c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
64d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64e0: 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
64f0: 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
6500: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
6510: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
6520: 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
6530: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
6540: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
6550: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
6560: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
6570: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
6580: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
6590: 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
65a0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
65b0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
65c0: 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
65d0: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
65e0: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
6610: 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
6620: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
6630: 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
6640: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
6650: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
6660: 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
6670: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
66a0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
66b0: 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
66c0: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
66d0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
66e0: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
66f0: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
6700: 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
6710: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
6720: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
6730: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6740: 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
6750: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
6760: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
6770: 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41  _FULL);..  OSTRA
6780: 43 45 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f  CE(("WRITE %d lo
6790: 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
67a0: 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
67b0: 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ype));..  rc = s
67c0: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
67d0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
67e0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38   rc==0 ){.    u8
67f0: 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70   *aRem = (u8 *)p
6800: 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  Buf;        /* D
6810: 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72  ata yet to be wr
6820: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
6830: 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20   nRem = amt;    
6840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6850: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65  mber of bytes ye
6860: 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
6870: 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72  */.    DWORD nWr
6880: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
6890: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72       /* Bytes wr
68a0: 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72  itten by each Wr
68b0: 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a  iteFile() call *
68c0: 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52  /..    while( nR
68d0: 65 6d 3e 30 20 26 26 20 57 72 69 74 65 46 69 6c  em>0 && WriteFil
68e0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
68f0: 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
6900: 20 30 29 20 26 26 20 6e 57 72 69 74 65 3e 30 20   0) && nWrite>0 
6910: 29 7b 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  ){.      aRem +=
6920: 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
6930: 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
6940: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
6950: 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
6960: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
6970: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
6980: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
6990: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
69a0: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  c ){.    if( pFi
69b0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
69c0: 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
69d0: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72  _FULL ){.      r
69e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
69f0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
6a00: 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
6a10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
6a20: 54 45 2c 20 22 77 69 6e 57 72 69 74 65 22 2c 20  TE, "winWrite", 
6a30: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
6a40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
6a50: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6a60: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
6a70: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
6a80: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
6a90: 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63  tic int winTrunc
6aa0: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
6ab0: 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
6ac0: 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69  t64 nByte){.  wi
6ad0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
6ae0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
6af0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a   File handle obj
6b00: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
6b10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
6b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6b30: 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  rn code for this
6b40: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
6b50: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
6b60: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ..  OSTRACE(("TR
6b70: 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e  UNCATE %d %lld\n
6b80: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  ", pFile->h, nBy
6b90: 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  te));.  Simulate
6ba0: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
6bb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
6bc0: 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  CATE);..  /* If 
6bd0: 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
6be0: 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
6bf0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
6c00: 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
6c10: 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
6c20: 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
6c30: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
6c40: 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
6c50: 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
6c60: 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
6c70: 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
6c80: 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
6c90: 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
6ca0: 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
6cb0: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
6cc0: 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >szChunk ){.    
6cd0: 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
6ce0: 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
6cf0: 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
6d00: 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
6d10: 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
6d20: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
6d30: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
6d40: 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
6d50: 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
6d60: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
6d70: 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
6d80: 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
6d90: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
6da0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
6db0: 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 77 69 6e  R_TRUNCATE, "win
6dc0: 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c  Truncate1", pFil
6dd0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
6de0: 73 65 20 69 66 28 20 30 3d 3d 53 65 74 45 6e 64  se if( 0==SetEnd
6df0: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
6e00: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
6e10: 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
6e20: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
6e30: 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
6e40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
6e50: 4e 43 41 54 45 2c 20 22 77 69 6e 54 72 75 6e 63  NCATE, "winTrunc
6e60: 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
6e70: 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  ath);.  }..  OST
6e80: 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
6e90: 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70  %d %lld %s\n", p
6ea0: 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
6eb0: 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
6ec0: 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
6ed0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
6ee0: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
6ef0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
6f00: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
6f10: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
6f20: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
6f30: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
6f40: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
6f50: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
6f60: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
6f70: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
6f80: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
6f90: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
6fa0: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
6fb0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
6fc0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
6fd0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
6fe0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
6ff0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
7000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7010: 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
7020: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
7030: 61 67 73 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  ags){.#if !defin
7040: 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
7050: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
7060: 5f 53 59 4e 43 29 20 7c 7c 20 64 65 66 69 6e 65  _SYNC) || define
7070: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
7080: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
7090: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
70a0: 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6c 73  .  BOOL rc;.#els
70b0: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
70c0: 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
70d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
70e0: 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
70f0: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
7100: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
7110: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
7120: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
7130: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
7140: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
7150: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
7160: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
7170: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
7180: 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
7190: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
71a0: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
71b0: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
71c0: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
71d0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
71e0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
71f0: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
7200: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
7210: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
7220: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
7230: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
7240: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
7250: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
7260: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
7270: 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
7280: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
7290: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
72a0: 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
72b0: 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
72c0: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
72d0: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
72e0: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
72f0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
7300: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
7310: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
7320: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
7330: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
7340: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
7350: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
7360: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
7370: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
7380: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
7390: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
73a0: 63 20 3d 20 46 6c 75 73 68 46 69 6c 65 42 75 66  c = FlushFileBuf
73b0: 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
73c0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
73d0: 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
73e0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
73f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7400: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
7410: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
7420: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
7430: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
7440: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
7450: 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 77 69 6e  OERR_FSYNC, "win
7460: 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
7470: 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
7480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
7490: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
74a0: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
74b0: 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
74c0: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
74d0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
74e0: 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
74f0: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f  4 *pSize){.  DWO
7500: 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20  RD upperBits;.  
7510: 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
7520: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
7530: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
7540: 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 3b  ;.  DWORD error;
7550: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
7560: 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
7570: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
7580: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
7590: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
75a0: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69   GetFileSize(pFi
75b0: 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  le->h, &upperBit
75c0: 73 29 3b 0a 20 20 69 66 28 20 20 20 28 6c 6f 77  s);.  if(   (low
75d0: 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
75e0: 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
75f0: 20 20 26 26 20 28 28 65 72 72 6f 72 20 3d 20 47    && ((error = G
7600: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20 21  etLastError()) !
7610: 3d 20 4e 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20  = NO_ERROR) ).  
7620: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
7630: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
7640: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
7650: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
7660: 45 52 52 5f 46 53 54 41 54 2c 20 22 77 69 6e 46  ERR_FSTAT, "winF
7670: 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
7680: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a  >zPath);.  }.  *
7690: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
76a0: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
76b0: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
76c0: 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53  Bits;.  return S
76d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
76e0: 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
76f0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
7700: 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
7710: 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
7720: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
7730: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
7740: 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
7750: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
7760: 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
7770: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
7780: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
7790: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
77a0: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
77b0: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
77c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
77d0: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
77e0: 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n95 or WinNT..*/
77f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52  .static int getR
7800: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
7810: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
7820: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
7830: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
7840: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c  ED ovlp;.    ovl
7850: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  p.Offset = SHARE
7860: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c  D_FIRST;.    ovl
7870: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30  p.OffsetHigh = 0
7880: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e  ;.    ovlp.hEven
7890: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d  t = 0;.    res =
78a0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c   LockFileEx(pFil
78b0: 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46  e->h, LOCKFILE_F
78c0: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c  AIL_IMMEDIATELY,
78d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
78e0: 20 20 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f        0, SHARED_
78f0: 53 49 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  SIZE, 0, &ovlp);
7900: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
7910: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7920: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
7930: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
7940: 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53  cuted. .*/.#if S
7950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
7960: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  0.  }else{.    i
7970: 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
7980: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
7990: 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
79a0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
79b0: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
79c0: 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
79d0: 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
79e0: 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
79f0: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69  s = LockFile(pFi
7a00: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
7a10: 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
7a20: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
7a30: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
7a40: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
7a50: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
7a60: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
7a70: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
7a80: 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
7a90: 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
7aa0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
7ab0: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
7ac0: 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
7ad0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c  /.static int unl
7ae0: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  ockReadLock(winF
7af0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
7b00: 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73  nt res;.  if( is
7b10: 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
7b20: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69  = UnlockFile(pFi
7b30: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
7b40: 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
7b50: 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54  IZE, 0);./* isNT
7b60: 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
7b70: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
7b80: 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
7b90: 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
7ba0: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
7bb0: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
7bc0: 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c  e{.    res = Unl
7bd0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
7be0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
7bf0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
7c00: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
7c10: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
7c20: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 47 65 74  f( res==0 && Get
7c30: 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52  LastError()!=ERR
7c40: 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 20 29 7b  OR_NOT_LOCKED ){
7c50: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
7c60: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
7c70: 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
7c80: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
7c90: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 75 6e  OERR_UNLOCK, "un
7ca0: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
7cb0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
7cc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
7cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
7ce0: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
7cf0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
7d00: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
7d10: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
7d20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
7d30: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
7d40: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
7d50: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
7d60: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
7d70: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
7d80: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
7d90: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
7da0: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
7db0: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
7dc0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
7dd0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
7de0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
7df0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
7e00: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
7e10: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
7e20: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
7e30: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
7e40: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
7e50: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
7e60: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
7e70: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
7e80: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
7e90: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
7ea0: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
7eb0: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
7ec0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
7ed0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
7ee0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
7ef0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
7f00: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
7f10: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
7f20: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
7f30: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
7f40: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
7f50: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
7f60: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
7f70: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
7f80: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
7f90: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
7fa0: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
7fb0: 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
7fc0: 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
7fd0: 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
7fe0: 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
7ff0: 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
8000: 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
8010: 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
8020: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
8030: 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
8040: 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
8050: 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
8060: 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
8070: 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
8080: 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
8090: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
80a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
80b0: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
80c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
80d0: 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
80e0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
80f0: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
8100: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
8110: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
8120: 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a windows lock
8130: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
8140: 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
8150: 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
8160: 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
8170: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
8180: 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
8190: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
81a0: 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
81b0: 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
81c0: 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
81d0: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
81e0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
81f0: 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72  *)id;.  DWORD er
8200: 72 6f 72 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  ror = NO_ERROR;.
8210: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
8220: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
8230: 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25  LOCK %d %d was %
8240: 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  d(%d)\n",.      
8250: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
8260: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
8270: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
8280: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
8290: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
82a0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
82b0: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
82c0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
82d0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
82e0: 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
82f0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
8300: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
8310: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
8320: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
8330: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
8340: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
8350: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
8360: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
8370: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
8380: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8390: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
83a0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
83b0: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
83c0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
83d0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
83e0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
83f0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
8400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
8410: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
8420: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
8430: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
8440: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
8450: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
8460: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
8470: 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
8480: 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
8490: 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
84a0: 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
84b0: 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
84c0: 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
84d0: 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
84e0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
84f0: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
8500: 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
8510: 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
8520: 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
8530: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
8540: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
8550: 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
8560: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
8570: 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
8580: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
8590: 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
85a0: 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
85b0: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
85c0: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
85d0: 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
85e0: 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
85f0: 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46   && (res = LockF
8600: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
8610: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
8620: 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
8630: 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
8640: 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
8650: 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70  ing lock.  The p
8660: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68  ending lock migh
8670: 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65  t be.      ** he
8680: 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65  ld by another re
8690: 61 64 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f  ader process who
86a0: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74   will release it
86b0: 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20   momentarily..  
86c0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54      */.      OST
86d0: 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74  RACE(("could not
86e0: 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c   get a PENDING l
86f0: 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20  ock. cnt=%d\n", 
8700: 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 53 6c 65  cnt));.      Sle
8710: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
8720: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
8730: 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
8740: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 65 72 72  res ){.      err
8750: 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
8760: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
8770: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
8780: 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
8790: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
87a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
87b0: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
87c0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
87d0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
87e0: 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
87f0: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
8800: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
8810: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
8820: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
8830: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72 72  }else{.      err
8840: 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
8850: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
8860: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
8870: 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
8880: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
8890: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
88a0: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
88b0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
88c0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
88d0: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
88e0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
88f0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
8900: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
8910: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
8920: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
8930: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
8940: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
8950: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
8960: 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
8970: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
8980: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
8990: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
89a0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
89b0: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
89c0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
89d0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
89e0: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
89f0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
8a00: 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
8a10: 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
8a20: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
8a30: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
8a40: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
8a50: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
8a60: 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
8a70: 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f  ;.    res = unlo
8a80: 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
8a90: 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
8aa0: 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64  "unreadlock = %d
8ab0: 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20  \n", res));.    
8ac0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
8ad0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
8ae0: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
8af0: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
8b00: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
8b10: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
8b20: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
8b30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
8b40: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
8b50: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
8b60: 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64  RACE(("error-cod
8b70: 65 20 3d 20 25 64 5c 6e 22 2c 20 65 72 72 6f 72  e = %d\n", error
8b80: 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61  ));.      getRea
8b90: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
8ba0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
8bb0: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
8bc0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
8bd0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
8be0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
8bf0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
8c00: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
8c10: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
8c20: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
8c30: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  D_LOCK ){.    Un
8c40: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
8c50: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
8c60: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
8c70: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
8c80: 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
8c90: 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
8ca0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
8cb0: 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
8cc0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
8cd0: 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
8ce0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
8cf0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
8d00: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
8d10: 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
8d20: 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69  K FAILED %d tryi
8d30: 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f  ng for %d but go
8d40: 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t %d\n", pFile->
8d50: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
8d60: 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
8d70: 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65  ype));.    pFile
8d80: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
8d90: 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ror;.    rc = SQ
8da0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
8db0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
8dc0: 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
8dd0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
8de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8df0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
8e00: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
8e10: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
8e20: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
8e30: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
8e40: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
8e50: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
8e60: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
8e70: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
8e80: 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
8e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8ea0: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
8eb0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
8ec0: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
8ed0: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
8ee0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
8ef0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
8f00: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
8f10: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
8f20: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
8f30: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
8f40: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
8f50: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
8f60: 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
8f70: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
8f80: 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
8f90: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
8fa0: 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
8fb0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
8fc0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
8fd0: 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70   rc = LockFile(p
8fe0: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
8ff0: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
9000: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
9010: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65        UnlockFile
9020: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
9030: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
9040: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
9050: 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52   = !rc;.    OSTR
9060: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
9070: 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
9080: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
9090: 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
90a0: 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
90b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
90c0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
90d0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
90e0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
90f0: 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
9100: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
9110: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
9120: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
9130: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
9140: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
9150: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
9160: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
9170: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
9180: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
9190: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
91a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
91b0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
91c0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
91d0: 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
91e0: 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
91f0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
9200: 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
9210: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
9220: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
9230: 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
9240: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
9250: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
9260: 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
9270: 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
9280: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
9290: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
92a0: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
92b0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
92c0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
92d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
92e0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
92f0: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
9300: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
9310: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
9320: 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
9330: 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28  %d to %d was %d(
9340: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
9350: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
9360: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
9370: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
9380: 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a  aredLockByte));.
9390: 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
93a0: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
93b0: 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
93c0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
93d0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
93e0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
93f0: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
9400: 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  );.    if( lockt
9410: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9420: 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b   && !getReadLock
9430: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
9440: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
9450: 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
9460: 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
9470: 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
9480: 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
9490: 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
94a0: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
94b0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
94c0: 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 77 69 6e 55  RR_UNLOCK, "winU
94d0: 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
94e0: 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
94f0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
9500: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
9510: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
9520: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
9530: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
9540: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
9550: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74  pe==NO_LOCK && t
9560: 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
9570: 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65   ){.    unlockRe
9580: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
9590: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
95a0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
95b0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
95c0: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
95d0: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
95e0: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
95f0: 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
9600: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
9610: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  c;.}../*.** Cont
9620: 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
9630: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
9640: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
9650: 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
9660: 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
9670: 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
9680: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
9690: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
96a0: 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
96b0: 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
96c0: 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
96d0: 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  = ((winFile*)id)
96e0: 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
96f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9700: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
9710: 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  se SQLITE_LAST_E
9720: 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
9730: 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74  int*)pArg = (int
9740: 29 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d  )((winFile*)id)-
9750: 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
9760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9770: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
9780: 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
9790: 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
97a0: 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 69      ((winFile*)i
97b0: 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  d)->szChunk = *(
97c0: 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
97d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
97e0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
97f0: 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
9800: 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
9810: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
9820: 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f   sz = *(sqlite3_
9830: 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
9840: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
9850: 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
9860: 20 20 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69     winTruncate(i
9870: 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 53 69  d, sz);.      Si
9880: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
9890: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65  ign(0);.      re
98a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
98b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
98c0: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
98d0: 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20  _OMITTED: {.    
98e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
98f0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
9900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9910: 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
9920: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
9930: 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
9940: 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
9950: 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
9960: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
9970: 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
9980: 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
9990: 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
99a0: 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
99b0: 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
99c0: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
99d0: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
99e0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
99f0: 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
9a00: 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
9a10: 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
9a20: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
9a30: 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
9a40: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
9a50: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
9a60: 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
9a70: 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
9a80: 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
9a90: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
9aa0: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
9ab0: 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
9ac0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
9ad0: 20 2a 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28   *id){.  assert(
9ae0: 20 69 64 21 3d 30 20 29 3b 0a 20 20 72 65 74 75   id!=0 );.  retu
9af0: 72 6e 20 28 69 6e 74 29 28 28 28 77 69 6e 46 69  rn (int)(((winFi
9b00: 6c 65 2a 29 69 64 29 2d 3e 73 65 63 74 6f 72 53  le*)id)->sectorS
9b10: 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ize);.}../*.** R
9b20: 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
9b30: 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
9b40: 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
9b50: 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
9b60: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
9b70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
9b80: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
9b90: 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65  AMETER(id);.  re
9ba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
9bb0: 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
9bc0: 45 4e 5f 4f 50 45 4e 3b 0a 7d 0a 0a 23 69 66 6e  EN_OPEN;.}..#ifn
9bd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9be0: 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  WAL../* .** Wind
9bf0: 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
9c00: 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
9c10: 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
9c20: 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
9c30: 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
9c40: 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
9c50: 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
9c60: 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
9c70: 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
9c80: 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
9c90: 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
9ca0: 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f  ..*/.SYSTEM_INFO
9cb0: 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a   winSysInfo;../*
9cc0: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
9cd0: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
9ce0: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
9cf0: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
9d00: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
9d10: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
9d20: 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f  rotect the winLo
9d30: 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75  ckInfo objects u
9d40: 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20  sed by .** this 
9d50: 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
9d60: 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
9d70: 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
9d80: 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
9d90: 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
9da0: 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
9db0: 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
9dc0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
9dd0: 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
9de0: 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
9df0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
9e00: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
9e10: 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
9e20: 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
9e30: 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
9e40: 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
9e50: 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
9e60: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
9e70: 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
9e80: 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
9e90: 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
9ea0: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
9eb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9ec0: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
9ed0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
9ee0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
9ef0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
9f00: 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
9f10: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
9f20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
9f30: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
9f40: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
9f50: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
9f60: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9f70: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
9f80: 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
9f90: 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
9fa0: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
9fb0: 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
9fc0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9fd0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
9fe0: 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  R));.}.#endif../
9ff0: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
a000: 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
a010: 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
a020: 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
a030: 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
a040: 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
a050: 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
a060: 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
a070: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
a080: 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
a090: 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
a0a0: 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
a0b0: 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
a0c0: 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
a0d0: 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
a0e0: 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
a0f0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
a100: 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
a110: 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
a120: 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
a130: 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
a140: 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
a150: 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
a160: 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
a170: 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
a180: 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
a190: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
a1a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
a1b0: 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
a1c0: 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
a1d0: 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  xt .**.** The fo
a1e0: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
a1f0: 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
a200: 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
a210: 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
a220: 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
a230: 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
a240: 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e  * Either winShmN
a250: 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
a260: 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d  e held or winShm
a270: 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
a280: 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
a290: 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
a2a0: 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
a2b0: 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
a2c0: 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
a2d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
a2e0: 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  /.struct winShmN
a2f0: 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode {.  sqlite3_
a300: 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
a310: 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
a320: 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
a330: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
a340: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
a350: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
a360: 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69   file */.  winFi
a370: 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20  le hFile;       
a380: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
a390: 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65  ndle from winOpe
a3a0: 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65  n */..  int szRe
a3b0: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
a3c0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
a3d0: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
a3e0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
a3f0: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
a400: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
a410: 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
a420: 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
a430: 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
a440: 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
a450: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
a460: 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
a470: 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
a480: 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
a490: 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
a4a0: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
a4b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
a4c0: 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
a4d0: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
a4e0: 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
a4f0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
a500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a510: 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
a520: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
a530: 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
a540: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
a550: 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
a560: 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
a570: 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
a580: 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
a590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
a5a0: 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
a5b0: 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
a5c0: 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ts */.#ifdef SQL
a5d0: 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e  ITE_DEBUG.  u8 n
a5e0: 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
a5f0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
a600: 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e  vailable winShm.
a610: 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
a620: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  if.};../*.** A g
a630: 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61  lobal array of a
a640: 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
a650: 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  jects..**.** The
a660: 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
a670: 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
a680: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
a690: 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69   writing this li
a6a0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69  st..*/.static wi
a6b0: 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d  nShmNode *winShm
a6c0: 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  NodeList = 0;../
a6d0: 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
a6e0: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
a6f0: 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
a700: 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
a710: 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
a720: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
a730: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
a740: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
a750: 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
a760: 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
a770: 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
a780: 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
a790: 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
a7a0: 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70  *.**    winShm.p
a7b0: 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69  ShmNode.**    wi
a7c0: 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  nShm.id.**.** Al
a7d0: 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
a7e0: 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
a7f0: 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e  The winShm.pShmN
a800: 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ode->mutex must 
a810: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
a820: 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
a830: 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
a840: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  ..*/.struct winS
a850: 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  hm {.  winShmNod
a860: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
a870: 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
a880: 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  ing winShmNode o
a890: 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68  bject */.  winSh
a8a0: 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
a8b0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69        /* Next wi
a8c0: 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  nShm with the sa
a8d0: 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  me winShmNode */
a8e0: 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a900: 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
a910: 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
a920: 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
a930: 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
a940: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
a950: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
a960: 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
a970: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
a980: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
a990: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
a9a0: 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ld */.#ifdef SQL
a9b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69  ITE_DEBUG.  u8 i
a9c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
a9d0: 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
a9e0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
a9f0: 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
aa00: 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
aa10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
aa20: 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
aa30: 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
aa40: 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
aa50: 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
aa60: 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
aa70: 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
aa80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
aa90: 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
aaa0: 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
aab0: 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
aac0: 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
aad0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
aae0: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
aaf0: 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
ab00: 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
ab10: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f  */.#define _SHM_
ab20: 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
ab30: 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23   _SHM_RDLCK  2.#
ab40: 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
ab50: 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  K  3.static int 
ab60: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
ab70: 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  (.  winShmNode *
ab80: 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70  pFile,    /* App
ab90: 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
aba0: 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
abb0: 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
abc0: 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
abd0: 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55         /* _SHM_U
abe0: 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  NLCK, _SHM_RDLCK
abf0: 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  , or _SHM_WRLCK 
ac00: 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
ac10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
ac20: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
ac30: 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
ac40: 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
ac50: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
ac60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac70: 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
ac80: 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
ac90: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
aca0: 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
acb0: 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  s;.  int rc = 0;
acc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
acd0: 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
ace0: 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
acf0: 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
ad00: 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
ad10: 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
ad20: 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
ad30: 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
ad40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ad50: 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
ad60: 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
ad70: 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
ad80: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
ad90: 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
ada0: 72 73 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20  rs */.  dwFlags 
adb0: 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  = LOCKFILE_FAIL_
adc0: 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69  IMMEDIATELY;.  i
add0: 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
ade0: 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
adf0: 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
ae00: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
ae10: 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c  .  memset(&ovlp,
ae20: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
ae30: 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e  APPED));.  ovlp.
ae40: 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a  Offset = ofst;..
ae50: 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
ae60: 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
ae70: 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
ae80: 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
ae90: 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
aea0: 72 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45  rc = UnlockFileE
aeb0: 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  x(pFile->hFile.h
aec0: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26  , 0, nByte, 0, &
aed0: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
aee0: 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c      rc = LockFil
aef0: 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65  eEx(pFile->hFile
af00: 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20  .h, dwFlags, 0, 
af10: 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29  nByte, 0, &ovlp)
af20: 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  ;.  }.  .  if( r
af30: 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
af40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
af50: 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
af60: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 47 65  >lastErrno =  Ge
af70: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
af80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
af90: 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
afa0: 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
afb0: 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e   %s %s 0x%08lx\n
afc0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  ", .           p
afd0: 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
afe0: 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
aff0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
b000: 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20   "failed",.     
b010: 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d        lockType==
b020: 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e  _SHM_UNLCK ? "Un
b030: 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c  lockFileEx" : "L
b040: 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20  ockFileEx",.    
b050: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b060: 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65  stErrno));..  re
b070: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
b080: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
b090: 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
b0a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
b0b0: 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
b0c0: 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
b0d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
b0e0: 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
b0f0: 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
b100: 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
b110: 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
b120: 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
b130: 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
b140: 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
b150: 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
b160: 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
b170: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
b180: 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
b190: 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
b1a0: 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
b1b0: 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
b1c0: 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
b1d0: 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
b1e0: 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
b1f0: 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
b200: 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
b210: 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
b220: 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
b230: 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42  nShmNode *p;.  B
b240: 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72  OOL bRc;.  asser
b250: 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
b260: 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26  ld() );.  pp = &
b270: 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
b280: 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
b290: 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
b2a0: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
b2b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b2c0: 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
b2d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
b2e0: 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
b2f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b300: 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
b310: 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
b320: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
b330: 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
b340: 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
b350: 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
b360: 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65   pid-%d unmap re
b370: 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  gion=%d %s\n",. 
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50  (int)GetCurrentP
b3a0: 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20  rocessId(), i,. 
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
b3d0: 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
b3e0: 20 62 52 63 20 3d 20 43 6c 6f 73 65 48 61 6e 64   bRc = CloseHand
b3f0: 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
b400: 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .hMap);.        
b410: 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
b420: 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65  RGE pid-%d close
b430: 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22   region=%d %s\n"
b440: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b450: 20 20 20 28 69 6e 74 29 47 65 74 43 75 72 72 65     (int)GetCurre
b460: 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
b470: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b480: 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20     bRc ? "ok" : 
b490: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
b4a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
b4b0: 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56 41  >hFile.h != INVA
b4c0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
b4e0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
b4f0: 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
b500: 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
b510: 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
b520: 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
b530: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
b540: 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
b550: 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
b560: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
b570: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
b580: 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
b590: 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  inDelete(pVfs, p
b5a0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  ->zFilename, 0);
b5b0: 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
b5c0: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
b5d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b5e0: 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
b5f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
b600: 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
b610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
b620: 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
b630: 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
b640: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
b650: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
b660: 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
b670: 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
b680: 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
b690: 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
b6a0: 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
b6b0: 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
b6c0: 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
b6d0: 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
b6e0: 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
b6f0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
b700: 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
b710: 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
b720: 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
b730: 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
b740: 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
b750: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
b760: 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
b770: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
b780: 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
b790: 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
b7a0: 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
b7b0: 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
b7e0: 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
b7f0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
b800: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
b810: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
b820: 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
b830: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
b840: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b860: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
b870: 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
b880: 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
b890: 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
b8a0: 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
b8b0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
b8c0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b8e0: 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
b8f0: 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
b900: 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
b910: 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
b920: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
b930: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
b940: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
b950: 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
b960: 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
b970: 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
b980: 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
b990: 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
b9a0: 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
b9b0: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
b9c0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
b9d0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
b9e0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b9f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ba00: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
ba10: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e  izeof(*p));.  nN
ba20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
ba30: 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61  len30(pDbFd->zPa
ba40: 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  th);.  pNew = sq
ba50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
ba60: 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
ba70: 2b 20 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a  + nName + 15 );.
ba80: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
ba90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
baa0: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
bab0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bac0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
bad0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
bae0: 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  w));.  pNew->zFi
baf0: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
bb00: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
bb10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
bb20: 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
bb30: 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
bb40: 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
bb50: 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
bb60: 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
bb70: 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
bb80: 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
bb90: 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
bba0: 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
bbb0: 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
bbc0: 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
bbd0: 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
bbe0: 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
bbf0: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
bc00: 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
bc10: 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
bc20: 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
bc30: 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
bc40: 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
bc50: 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
bc60: 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
bc70: 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
bc80: 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
bc90: 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
bca0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
bcb0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
bcc0: 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
bcd0: 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
bce0: 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
bcf0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
bd00: 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
bd10: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
bd20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
bd30: 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
bd40: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
bd50: 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
bd60: 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
bd70: 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
bd80: 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
bd90: 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
bda0: 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
bdb0: 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
bdc0: 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
bdd0: 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
bde0: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
bdf0: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
be00: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
be10: 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
be20: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
be30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
be40: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
be50: 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
be60: 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
be70: 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
be80: 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
be90: 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
bea0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
beb0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
bec0: 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
bed0: 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  8) */.          
bee0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
bef0: 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
bf00: 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65  >hFile,  /* File
bf10: 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf30: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
bf40: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
bf50: 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
bf60: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f  E_OPEN_CREATE, /
bf70: 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  * Mode flags */.
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
bfa0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
bfb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
bfc0: 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
bfd0: 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
bfe0: 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
bff0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
c000: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
c010: 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
c020: 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
c030: 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20  itch..    ** If 
c040: 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68  not, truncate th
c050: 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
c060: 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20  ength. .    */. 
c070: 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73     if( winShmSys
c080: 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
c090: 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  , _SHM_WRLCK, WI
c0a0: 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
c0b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c0c0: 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
c0d0: 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
c0e0: 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
c0f0: 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
c100: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c110: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
c120: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
c130: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
c140: 4e 2c 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c  N, "winOpenShm",
c150: 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
c160: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c170: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c180: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
c190: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
c1a0: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
c1b0: 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
c1c0: 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
c1d0: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
c1e0: 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
c1f0: 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
c200: 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
c210: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
c220: 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
c230: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
c240: 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
c250: 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
c260: 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
c270: 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
c280: 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
c290: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
c2a0: 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
c2b0: 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
c2c0: 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
c2d0: 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
c2e0: 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
c2f0: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
c300: 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
c310: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
c320: 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
c330: 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
c340: 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
c350: 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
c360: 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
c370: 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
c380: 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
c390: 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
c3a0: 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
c3b0: 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
c3c0: 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
c3d0: 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
c3e0: 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
c3f0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
c400: 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
c410: 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
c420: 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
c430: 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
c440: 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
c450: 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
c460: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
c470: 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
c480: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
c490: 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
c4a0: 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
c4b0: 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
c4c0: 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
c4d0: 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
c4e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
c4f0: 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
c500: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
c510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
c520: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
c530: 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
c540: 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
c550: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
c560: 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
c570: 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
c580: 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
c590: 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
c5a0: 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
c5b0: 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
c5c0: 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
c5d0: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
c5e0: 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
c5f0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
c600: 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
c610: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
c620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
c630: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
c640: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
c650: 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
c660: 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
c670: 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
c680: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
c690: 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
c6a0: 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
c6b0: 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
c6c0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
c6d0: 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
c6e0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
c6f0: 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
c700: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
c710: 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
c720: 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
c730: 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
c740: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
c750: 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
c760: 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
c770: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
c780: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
c790: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
c7a0: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
c7b0: 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
c7c0: 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
c7d0: 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
c7e0: 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
c7f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
c800: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
c810: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
c820: 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
c830: 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
c840: 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
c850: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c860: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c870: 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
c880: 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
c890: 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
c8a0: 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
c8b0: 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
c8c0: 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
c8d0: 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
c8e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
c8f0: 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
c900: 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
c910: 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
c920: 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
c930: 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
c940: 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
c950: 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
c960: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
c970: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
c980: 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
c990: 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
c9a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
c9b0: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
c9c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
c9d0: 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
c9e0: 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
c9f0: 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
ca00: 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
ca10: 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
ca20: 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
ca30: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
ca40: 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
ca50: 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
ca60: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
ca70: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
ca80: 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
ca90: 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
caa0: 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
cab0: 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
cac0: 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
cad0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cae0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
caf0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
cb00: 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
cb10: 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
cb20: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
cb30: 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
cb40: 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
cb50: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
cb60: 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
cb70: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
cb80: 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cba0: 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
cbb0: 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
cbc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
cbf0: 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
cc00: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
cc10: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
cc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
cc30: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
cc40: 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
cc50: 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
cc60: 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
cc70: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
cc80: 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
cc90: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
cca0: 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
ccb0: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
ccc0: 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
ccd0: 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
cce0: 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
ccf0: 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
cd20: 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
cd30: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
cd40: 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
cd50: 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
cd60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
cd90: 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cdc0: 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
cdd0: 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
cde0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
cdf0: 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
ce00: 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
ce10: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
ce20: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
ce30: 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
ce40: 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
ce50: 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
ce60: 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
ce70: 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
ce80: 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
ce90: 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
cea0: 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
ceb0: 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
cec0: 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
ced0: 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
cee0: 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
cef0: 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
cf00: 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
cf10: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
cf20: 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
cf30: 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
cf40: 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
cf50: 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
cf60: 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
cf70: 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
cf80: 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
cf90: 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
cfa0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
cfb0: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
cfc0: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
cfd0: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
cfe0: 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
cff0: 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
d000: 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
d010: 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
d020: 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
d030: 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
d040: 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
d050: 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
d060: 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
d070: 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
d080: 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
d090: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d0a0: 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
d0b0: 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
d0c0: 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
d0d0: 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
d0e0: 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
d0f0: 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
d100: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
d110: 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
d120: 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
d130: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
d140: 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
d150: 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
d160: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
d170: 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
d180: 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
d190: 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
d1a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
d1b0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
d1c0: 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
d1d0: 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
d1e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d1f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
d200: 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
d210: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
d220: 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
d230: 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69      } .  }else i
d240: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
d250: 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
d260: 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
d270: 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
d280: 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
d290: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
d2a0: 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
d2b0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
d2c0: 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
d2d0: 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
d2e0: 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
d2f0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
d300: 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
d310: 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
d320: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
d330: 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
d340: 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
d350: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
d360: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
d370: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
d380: 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
d390: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
d3a0: 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
d3b0: 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
d3c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d3d0: 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
d3e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d3f0: 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
d400: 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
d410: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
d420: 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
d430: 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
d440: 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
d450: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d460: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d470: 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
d480: 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
d490: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
d4a0: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
d4b0: 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
d4c0: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
d4d0: 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
d4e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
d4f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d500: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d510: 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
d520: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
d530: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d540: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d550: 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
d560: 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
d570: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
d580: 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
d590: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
d5a0: 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
d5b0: 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
d5c0: 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
d5d0: 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
d5e0: 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
d5f0: 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
d600: 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
d610: 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
d620: 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
d630: 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
d640: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
d650: 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
d660: 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
d670: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
d680: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
d690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d6a0: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
d6b0: 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
d6c0: 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
d6d0: 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
d6e0: 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
d6f0: 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
d700: 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
d710: 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
d720: 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
d730: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d750: 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
d760: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
d770: 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
d780: 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
d790: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
d7a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d7b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
d7c0: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
d7d0: 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
d7e0: 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
d7f0: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
d800: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
d810: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d820: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
d830: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
d840: 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
d850: 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
d860: 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20  ,%03x %s\n",.   
d870: 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28          p->id, (
d880: 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
d890: 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68  ocessId(), p->sh
d8a0: 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
d8b0: 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
d8c0: 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20    rc ? "failed" 
d8d0: 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
d8e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d8f0: 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
d900: 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
d910: 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
d920: 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
d930: 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
d940: 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
d950: 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
d960: 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
d970: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
d980: 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
d990: 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
d9a0: 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
d9b0: 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
d9c0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
d9d0: 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
d9e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
d9f0: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
da00: 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
da10: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
da20: 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
da30: 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
da40: 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
da50: 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
da60: 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
da70: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
da80: 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
da90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
daa0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
dab0: 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
dac0: 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
dad0: 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
dae0: 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
daf0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
db00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
db10: 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
db20: 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
db30: 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
db40: 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
db50: 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
db60: 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
db70: 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
db80: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
db90: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
dba0: 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
dbb0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
dbc0: 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
dbd0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
dbe0: 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
dbf0: 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
dc00: 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
dc10: 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
dc20: 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
dc30: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
dc40: 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
dc50: 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
dc60: 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
dc70: 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
dc80: 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
dc90: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
dca0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
dcb0: 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
dcc0: 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
dcd0: 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
dce0: 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
dcf0: 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
dd00: 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
dd10: 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
dd20: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
dd30: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
dd40: 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
dd50: 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
dd60: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
dd70: 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
dd80: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
dd90: 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
dda0: 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
ddb0: 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
ddc0: 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
ddd0: 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
dde0: 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
ddf0: 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
de00: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
de10: 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
de20: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
de30: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
de40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de50: 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
de60: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de80: 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
de90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
dea0: 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
ded0: 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
dee0: 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df00: 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
df10: 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
df20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
df30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
df40: 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
df50: 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
df60: 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df80: 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
df90: 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
dfa0: 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
dfb0: 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
dfc0: 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
dfd0: 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
dfe0: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
dff0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e000: 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
e010: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
e020: 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
e030: 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
e040: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
e050: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
e060: 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
e070: 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
e080: 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
e090: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e0a0: 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
e0b0: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
e0c0: 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
e0d0: 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
e0e0: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
e0f0: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
e100: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
e110: 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
e120: 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
e130: 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
e140: 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
e150: 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
e160: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
e170: 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
e180: 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
e190: 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
e1a0: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
e1b0: 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
e1d0: 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
e1e0: 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
e1f0: 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
e200: 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
e210: 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
e220: 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
e230: 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
e240: 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
e250: 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
e260: 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
e270: 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
e280: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
e290: 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
e2a0: 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
e2b0: 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
e2c0: 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
e2d0: 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
e2e0: 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
e2f0: 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
e300: 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
e310: 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
e320: 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
e330: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e340: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
e350: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
e360: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22  IOERR_SHMSIZE, "
e370: 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
e380: 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
e390: 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
e3a0: 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
e3b0: 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
e3c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
e3d0: 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
e3e0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
e3f0: 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
e400: 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
e410: 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
e420: 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
e430: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
e440: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
e450: 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
e460: 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
e470: 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
e480: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
e490: 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
e4a0: 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
e4b0: 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
e4c0: 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
e4d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
e4e0: 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
e4f0: 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
e500: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
e510: 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
e520: 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
e530: 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
e540: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e550: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e560: 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
e570: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e580: 5f 53 48 4d 53 49 5a 45 2c 20 22 77 69 6e 53 68  _SHMSIZE, "winSh
e590: 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap2", pDbFd->z
e5a0: 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67  Path);.        g
e5b0: 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
e5c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e5d0: 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72      /* Map the r
e5e0: 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
e5f0: 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73  region into this
e600: 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
e610: 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ss space. */.   
e620: 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74   apNew = (struct
e630: 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c   ShmRegion *)sql
e640: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
e650: 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
e660: 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  aRegion, (iRegio
e670: 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65  n+1)*sizeof(apNe
e680: 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20  w[0]).    );.   
e690: 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
e6a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e6b0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
e6c0: 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
e6d0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
e6e0: 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
e6f0: 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20  n = apNew;..    
e700: 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
e710: 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
e720: 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c  n ){.      HANDL
e730: 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
e740: 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d         /* file-m
e750: 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f  apping handle */
e760: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61  .      void *pMa
e770: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
e780: 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d     /* Mapped mem
e790: 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ory region */.  
e7a0: 20 20 20 0a 20 20 20 20 20 20 68 4d 61 70 20 3d     .      hMap =
e7b0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
e7c0: 6e 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  ng(pShmNode->hFi
e7d0: 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
e7e0: 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
e7f0: 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
e800: 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20   NULL.      );. 
e810: 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
e820: 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63 72  HM-MAP pid-%d cr
e830: 65 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e  eate region=%d n
e840: 62 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  byte=%d %s\n",. 
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
e860: 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72 6f  nt)GetCurrentPro
e870: 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
e880: 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79  de->nRegion, nBy
e890: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
e8a0: 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     hMap ? "ok" :
e8b0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
e8c0: 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
e8d0: 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
e8e0: 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  et = pShmNode->n
e8f0: 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
e900: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
e910: 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
e920: 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
e930: 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
e940: 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 20 20  nularity;.      
e950: 20 20 70 4d 61 70 20 3d 20 4d 61 70 56 69 65 77    pMap = MapView
e960: 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c  OfFile(hMap, FIL
e970: 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
e980: 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
e990: 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66           0, iOff
e9a0: 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
e9b0: 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
e9c0: 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
e9d0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 4f      );.        O
e9e0: 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
e9f0: 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69   pid-%d map regi
ea00: 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20  on=%d offset=%d 
ea10: 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  size=%d %s\n",. 
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50  (int)GetCurrentP
ea40: 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
ea50: 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69  Node->nRegion, i
ea60: 4f 66 66 73 65 74 2c 20 73 7a 52 65 67 69 6f 6e  Offset, szRegion
ea70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ea80: 20 20 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a     pMap ? "ok" :
ea90: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
eaa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
eab0: 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  pMap ){.        
eac0: 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72  pShmNode->lastEr
ead0: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
eae0: 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63  or();.        rc
eaf0: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
eb00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
eb10: 41 50 2c 20 22 77 69 6e 53 68 6d 4d 61 70 33 22  AP, "winShmMap3"
eb20: 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
eb30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61  .        if( hMa
eb40: 70 20 29 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28  p ) CloseHandle(
eb50: 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67  hMap);.        g
eb60: 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
eb70: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
eb80: 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
eb90: 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
eba0: 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70  ion].pMap = pMap
ebb0: 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
ebc0: 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
ebd0: 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61  de->nRegion].hMa
ebe0: 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20  p = hMap;.      
ebf0: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
ec00: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
ec10: 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
ec20: 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
ec30: 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
ec40: 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
ec50: 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  = iRegion*szRegi
ec60: 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  on;.    int iOff
ec70: 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
ec80: 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
ec90: 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
eca0: 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61  ularity;.    cha
ecb0: 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70  r *p = (char *)p
ecc0: 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
ecd0: 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a  [iRegion].pMap;.
ece0: 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20      *pp = (void 
ecf0: 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66  *)&p[iOffsetShif
ed00: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
ed10: 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
ed20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ed30: 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
ed40: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
ed50: 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
ed60: 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20  fine winShmMap  
ed70: 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
ed80: 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  nShmLock    0.# 
ed90: 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72  define winShmBar
eda0: 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
edb0: 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  winShmUnmap   0.
edc0: 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
edd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
ede0: 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  L */../*.** Here
edf0: 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
ee00: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
ee10: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
ee20: 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
ee30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
ee40: 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
ee50: 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
ee60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee70: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
ee80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eec0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
eed0: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
eee0: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
eef0: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
ef00: 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
ef10: 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
ef20: 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
ef30: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
ef40: 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
ef50: 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20  thod = {.  2,   
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
ef80: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
ef90: 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
efb0: 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
efc0: 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
efd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
efe0: 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
eff0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f000: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
f010: 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
f020: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
f030: 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
f040: 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
f050: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
f070: 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
f080: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
f090: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
f0a0: 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
f0b0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
f0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
f0d0: 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
f0e0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
f0f0: 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
f100: 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
f110: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
f120: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
f130: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
f140: 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
f150: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
f160: 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
f170: 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
f180: 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
f190: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
f1a0: 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
f1b0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
f1c0: 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
f1d0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
f1e0: 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
f1f0: 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
f200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
f210: 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
f220: 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
f230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
f240: 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
f250: 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
f260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
f270: 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
f280: 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20  winShmUnmap     
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
f2b0: 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
f2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f300: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
f310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
f320: 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
f330: 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
f350: 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
f360: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
f370: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
f380: 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
f390: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
f3a0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
f3b0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46  ** Convert a UTF
f3c0: 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f  -8 filename into
f3d0: 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74   whatever form t
f3e0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a  he underlying.**
f3f0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
f400: 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65  m wants filename
f410: 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  s in.  Space to 
f420: 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a  hold the result.
f430: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
f440: 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
f450: 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
f460: 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  the calling.** f
f470: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
f480: 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74  ic void *convert
f490: 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
f4a0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
f4b0: 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  me){.  void *zCo
f4c0: 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
f4d0: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
f4e0: 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74   zConverted = ut
f4f0: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
f500: 65 6e 61 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54 28  ename);./* isNT(
f510: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
f520: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
f530: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
f540: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
f550: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
f560: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
f570: 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
f580: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
f590: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46  _utf8_to_mbcs(zF
f5a0: 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
f5b0: 0a 20 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65 72  .  }.  /* caller
f5c0: 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74   will handle out
f5d0: 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
f5e0: 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65  return zConverte
f5f0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  d;.}../*.** Crea
f600: 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
f610: 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
f620: 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
f630: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a  big enough to.**
f640: 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d   hold at pVfs->m
f650: 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63  xPathname charac
f660: 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
f670: 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  int getTempname(
f680: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
f690: 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
f6a0: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
f6b0: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
f6c0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
f6d0: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
f6e0: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
f6f0: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
f700: 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20  9";.  size_t i, 
f710: 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50  j;.  char zTempP
f720: 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b  ath[MAX_PATH+1];
f730: 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
f740: 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
f750: 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
f760: 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
f770: 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
f780: 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
f790: 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
f7a0: 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
f7b0: 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
f7c0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
f7d0: 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
f7e0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
f7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f800: 52 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  R );..  if( sqli
f810: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
f820: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
f830: 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
f840: 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
f850: 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  h, "%s", sqlite3
f860: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
f870: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
f880: 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
f890: 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43   *zMulti;.    WC
f8a0: 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41  HAR zWidePath[MA
f8b0: 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65 74  X_PATH];.    Get
f8c0: 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41  TempPathW(MAX_PA
f8d0: 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68  TH-30, zWidePath
f8e0: 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20  );.    zMulti = 
f8f0: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  unicodeToUtf8(zW
f900: 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
f910: 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
f920: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f930: 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
f940: 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
f950: 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
f960: 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
f970: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
f980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
f990: 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73 4e  EM;.    }./* isN
f9a0: 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
f9b0: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
f9c0: 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
f9d0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
f9e0: 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53  .** Since the AS
f9f0: 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  CII version of t
fa00: 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
fa10: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
fa20: 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
fa30: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
fa40: 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
fa50: 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
fa60: 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
fa70: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
fa80: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
fa90: 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20  zUtf8;.    char 
faa0: 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50 41  zMbcsPath[MAX_PA
fab0: 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d 70  TH];.    GetTemp
fac0: 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33  PathA(MAX_PATH-3
fad0: 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  0, zMbcsPath);. 
fae0: 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74     zUtf8 = sqlit
faf0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
fb00: 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29  _utf8(zMbcsPath)
fb10: 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
fb20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fb30: 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
fb40: 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
fb50: 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
fb60: 20 20 20 20 20 20 66 72 65 65 28 7a 55 74 66 38        free(zUtf8
fb70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
fb80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fb90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
fba0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
fbb0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
fbc0: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
fbd0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
fbe0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
fbf0: 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
fc00: 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
fc10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
fc20: 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 73  R..  */.  if( (s
fc30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
fc40: 54 65 6d 70 50 61 74 68 29 20 2b 20 73 71 6c 69  TempPath) + sqli
fc50: 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49  te3Strlen30(SQLI
fc60: 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
fc70: 46 49 58 29 20 2b 20 31 37 29 20 3e 3d 20 6e 42  FIX) + 17) >= nB
fc80: 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  uf ){.    return
fc90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
fca0: 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69   }..  for(i=sqli
fcb0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
fcc0: 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a  pPath); i>0 && z
fcd0: 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
fce0: 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
fcf0: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
fd00: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
fd10: 6e 74 66 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75  ntf(nBuf-17, zBu
fd20: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  f,.             
fd30: 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49        "%s\\"SQLI
fd40: 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
fd50: 46 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b  FIX, zTempPath);
fd60: 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74  .  j = sqlite3St
fd70: 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
fd80: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
fd90: 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29  ss(15, &zBuf[j])
fda0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31  ;.  for(i=0; i<1
fdb0: 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
fdc0: 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
fdd0: 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
fde0: 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
fdf0: 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
fe00: 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a  s)-1) ];.  }.  z
fe10: 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 0a 20 20 4f  Buf[j] = 0;..  O
fe20: 53 54 52 41 43 45 28 28 22 54 45 4d 50 20 46 49  STRACE(("TEMP FI
fe30: 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a  LENAME: %s\n", z
fe40: 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
fe50: 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
fe60: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
fe70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fe80: 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
fe90: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
fea0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
feb0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fec0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
fed0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
fee0: 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
fef0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
ff00: 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
ff10: 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
ff20: 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
ff30: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ff50: 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
ff60: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
ff70: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
ff80: 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
ff90: 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
ffa0: 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
ffb0: 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
ffc0: 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
ffd0: 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
ffe0: 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
fff0: 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
10000 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
10010 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
10020 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
10030 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
10040 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
10050 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
10060 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
10070 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
10080 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
10090 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
100a0 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
100b0 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
100c0 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
100d0 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
100e0 64 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ding */..  /* If
100f0 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
10100 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10110 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
10120 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
10130 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
10140 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
10150 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
10160 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
10170 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
10180 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
10190 50 41 54 48 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  PATH+1];     /* 
101a0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63  Buffer used to c
101b0 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e  reate temp filen
101c0 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63  ame */..  int rc
101d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
101e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
101f0 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65  tion Return Code
10200 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
10210 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49  (NDEBUG) || SQLI
10220 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
10230 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
10240 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
10250 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
10260 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  open */.#endif..
10270 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
10280 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
10290 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
102a0 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
102b0 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
102c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
102d0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
102e0 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
102f0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
10300 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
10310 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
10320 47 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  G.  int isReadon
10330 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
10340 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10350 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ONLY);.#endif.  
10360 69 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20  int isReadWrite 
10370 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
10380 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
10390 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  E);..#ifndef NDE
103a0 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e  BUG.  int isOpen
103b0 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65  Journal = (isCre
103c0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
103d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
103e0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
103f0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
10400 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
10410 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
10420 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
10430 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
10440 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  ;.#endif..  /* C
10450 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
10460 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
10470 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
10480 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
10490 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
104a0 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
104b0 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
104c0 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
104d0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
104e0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
104f0 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
10500 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
10510 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
10520 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
10530 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
10540 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
10550 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
10560 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
10570 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
10580 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
10590 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
105a0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
105b0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
105c0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
105d0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
105e0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
105f0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
10600 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
10610 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
10620 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
10630 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
10640 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
10650 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
10660 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
10670 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
10680 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
10690 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
106a0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
106b0 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
106c0 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
106d0 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
106e0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
106f0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
10700 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
10710 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
10720 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
10730 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
10740 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
10750 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
10760 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
10770 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
10780 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
10790 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
107a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
107b0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
107c0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
107d0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
107e0 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
107f0 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
10800 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
10810 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
10820 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
10830 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
10840 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
10850 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
10860 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
10870 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
10880 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
10890 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
108a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
108b0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
108c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
108d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
108e0 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
108f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
10900 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
10910 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
10920 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
10930 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
10940 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
10950 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73  N_WAL.  );..  as
10960 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
10970 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10980 52 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c  R(pVfs);..  pFil
10990 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
109a0 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20  ANDLE_VALUE;..  
109b0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
109c0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
109d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
109e0 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
109f0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
10a00 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
10a10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
10a20 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
10a30 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
10a40 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29   !isOpenJournal)
10a50 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65  ;.    rc = getTe
10a60 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b  mpname(MAX_PATH+
10a70 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  1, zTmpname);.  
10a80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10a90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
10aa0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
10ab0 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
10ac0 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
10ad0 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69  * Convert the fi
10ae0 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79  lename to the sy
10af0 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a  stem encoding. *
10b00 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  /.  zConverted =
10b10 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
10b20 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b  name(zUtf8Name);
10b30 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
10b40 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
10b50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10b60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65  .  }..  if( isRe
10b70 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64  adWrite ){.    d
10b80 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
10b90 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
10ba0 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20  GENERIC_WRITE;. 
10bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65   }else{.    dwDe
10bc0 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
10bd0 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a  NERIC_READ;.  }.
10be0 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  /* SQLITE_OPE
10bf0 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20 75  N_EXCLUSIVE is u
10c00 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
10c10 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65   that a new file
10c20 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65   is .  ** create
10c30 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27  d. SQLite doesn'
10c40 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69  t use it to indi
10c50 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65 20  cate "exclusive 
10c60 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73  access" .  ** as
10c70 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
10c80 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
10c90 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
10ca0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  e ){.    /* Crea
10cb0 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
10cc0 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
10cd0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
10ce0 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
10cf0 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
10d00 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
10d10 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
10d20 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
10d30 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
10d40 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
10d50 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
10d60 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
10d70 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
10d80 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
10d90 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
10da0 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
10db0 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
10dc0 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
10dd0 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
10de0 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
10df0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
10e00 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
10e10 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65  ;.  }..  dwShare
10e20 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
10e30 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
10e40 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66  ARE_WRITE;..  if
10e50 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
10e60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10e70 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
10e80 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
10e90 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
10ea0 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
10eb0 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
10ec0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
10ed0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
10ee0 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
10f10 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
10f20 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
10f50 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
10f60 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
10f70 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
10f80 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
10f90 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
10fa0 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
10fb0 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
10fc0 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
10fd0 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
10fe0 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
10ff0 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
11000 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
11010 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
11020 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
11030 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
11040 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
11050 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
11060 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
11070 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54  ndif..  if( isNT
11080 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72  () ){.    h = Cr
11090 65 61 74 65 46 69 6c 65 57 28 28 57 43 48 41 52  eateFileW((WCHAR
110a0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
110b0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
110c0 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77 53  cess,.       dwS
110d0 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
110e0 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77   NULL,.       dw
110f0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
11100 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 6c  ion,.       dwFl
11110 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
11120 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20  ,.       NULL.  
11130 20 20 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69    );./* isNT() i
11140 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
11150 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
11160 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
11170 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
11180 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
11190 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
111a0 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
111b0 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
111c0 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
111d0 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
111e0 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
111f0 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
11200 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
11210 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
11220 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46  .    h = CreateF
11230 69 6c 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ileA((char*)zCon
11240 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 64  verted,.       d
11250 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
11260 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
11270 64 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c  de,.       NULL,
11280 0a 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69  .       dwCreati
11290 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
112a0 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
112b0 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
112c0 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 23     NULL.    );.#
112d0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 4f 53 54  endif.  }..  OST
112e0 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
112f0 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a  s 0x%lx %s\n", .
11300 20 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e             h, zN
11310 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
11320 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20  cess, .         
11330 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e    h==INVALID_HAN
11340 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69  DLE_VALUE ? "fai
11350 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
11360 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44    if( h==INVALID
11370 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
11380 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
11390 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
113a0 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
113b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
113c0 41 4e 54 4f 50 45 4e 2c 20 22 77 69 6e 4f 70 65  ANTOPEN, "winOpe
113d0 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
113e0 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
113f0 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ted);.    if( is
11400 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
11410 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65     return winOpe
11420 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69  n(pVfs, zName, i
11430 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
11440 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
11450 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e  OPEN_READONLY)&~
11460 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
11470 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
11480 52 45 41 44 57 52 49 54 45 29 29 2c 20 70 4f 75  READWRITE)), pOu
11490 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
114a0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
114b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
114c0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
114d0 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
114e0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
114f0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
11500 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
11510 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
11520 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
11530 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
11540 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
11550 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
11560 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 46    }..  memset(pF
11570 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ile, 0, sizeof(*
11580 70 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  pFile));.  pFile
11590 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e  ->pMethod = &win
115a0 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c  IoMethod;.  pFil
115b0 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c  e->h = h;.  pFil
115c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
115d0 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
115e0 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
115f0 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30   pFile->pShm = 0
11600 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ;.  pFile->zPath
11610 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c   = zName;.  pFil
11620 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
11630 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 56  getSectorSize(pV
11640 66 73 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  fs, zUtf8Name);.
11650 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
11660 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61  INCE.  if( isRea
11670 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d  dWrite && eType=
11680 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
11690 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 21  N_DB.       && !
116a0 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
116b0 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20  zName, pFile).  
116c0 29 7b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  ){.    CloseHand
116d0 6c 65 28 68 29 3b 0a 20 20 20 20 66 72 65 65 28  le(h);.    free(
116e0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
116f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11700 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
11710 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
11720 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65  {.    pFile->zDe
11730 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43  leteOnClose = zC
11740 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73  onverted;.  }els
11750 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
11760 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
11770 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43 6f  );.  }..  OpenCo
11780 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
11790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
117a0 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65   Delete the name
117b0 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  d file..**.** No
117c0 74 65 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20  te that windows 
117d0 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
117e0 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
117f0 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
11800 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73  r.** process has
11810 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74   it open.  Somet
11820 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61  imes a virus sca
11830 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67  nner or indexing
11840 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c   program.** will
11850 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
11860 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74  file shortly aft
11870 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64  er it is created
11880 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a   in order to do.
11890 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64  ** whatever it d
118a0 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73  oes.  While this
118b0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
118c0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a  s holding the.**
118d0 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77   file open, we w
118e0 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  ill be unable to
118f0 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20   delete it.  To 
11900 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
11910 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  .** problem, we 
11920 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73  delay 100 millis
11930 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74  econds and try t
11940 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20  o delete again. 
11950 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c   Up.** to MX_DEL
11960 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64  ETION_ATTEMPTs d
11970 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  eletion attempts
11980 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20   are run before 
11990 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64  giving.** up and
119a0 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
119b0 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
119c0 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
119d0 4d 50 54 53 20 35 0a 73 74 61 74 69 63 20 69 6e  MPTS 5.static in
119e0 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73  t winDelete(.  s
119f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
11a00 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
11a10 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
11a20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11a30 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
11a40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
11a50 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
11a60 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20  int syncDir     
11a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11a80 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
11a90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74   */.){.  int cnt
11aa0 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 72 63   = 0;.  DWORD rc
11ab0 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20  ;.  DWORD error 
11ac0 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  = 0;.  void *zCo
11ad0 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
11ae0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
11af0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
11b00 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a  METER(syncDir);.
11b10 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11b20 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
11b30 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
11b40 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
11b50 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
11b60 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
11b70 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
11b80 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
11b90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11ba0 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
11bb0 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  ){.    do{.     
11bc0 20 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f   DeleteFileW(zCo
11bd0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77  nverted);.    }w
11be0 68 69 6c 65 28 20 20 20 28 20 20 20 28 28 72 63  hile(   (   ((rc
11bf0 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62   = GetFileAttrib
11c00 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64  utesW(zConverted
11c10 29 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49  )) != INVALID_FI
11c20 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 0a 20  LE_ATTRIBUTES). 
11c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
11c40 20 28 28 65 72 72 6f 72 20 3d 20 47 65 74 4c 61   ((error = GetLa
11c50 73 74 45 72 72 6f 72 28 29 29 20 3d 3d 20 45 52  stError()) == ER
11c60 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
11c70 44 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  D)).           &
11c80 26 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45  & (++cnt < MX_DE
11c90 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29  LETION_ATTEMPTS)
11ca0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
11cb0 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  Sleep(100), 1) )
11cc0 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
11cd0 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
11ce0 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
11cf0 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
11d00 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
11d10 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
11d20 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
11d30 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
11d40 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
11d50 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
11d60 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
11d70 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
11d80 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
11d90 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
11da0 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
11db0 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65    do{.      Dele
11dc0 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
11dd0 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ed);.    }while(
11de0 20 20 20 28 20 20 20 28 28 72 63 20 3d 20 47 65     (   ((rc = Ge
11df0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
11e00 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20 21 3d  (zConverted)) !=
11e10 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
11e20 54 52 49 42 55 54 45 53 29 0a 20 20 20 20 20 20  TRIBUTES).      
11e30 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 65 72           || ((er
11e40 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
11e50 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41  or()) == ERROR_A
11e60 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29 0a 20  CCESS_DENIED)). 
11e70 20 20 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b            && (++
11e80 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f  cnt < MX_DELETIO
11e90 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20 20 20  N_ATTEMPTS).    
11ea0 20 20 20 20 20 20 20 26 26 20 28 53 6c 65 65 70         && (Sleep
11eb0 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e  (100), 1) );.#en
11ec0 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
11ed0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53  Converted);.  OS
11ee0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c  TRACE(("DELETE \
11ef0 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69  "%s\" %s\n", zFi
11f00 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 28  lename,.       (
11f10 20 28 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 46 49   (rc==INVALID_FI
11f20 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26  LE_ATTRIBUTES) &
11f30 26 20 28 65 72 72 6f 72 3d 3d 45 52 52 4f 52 5f  & (error==ERROR_
11f40 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29  FILE_NOT_FOUND))
11f50 20 3f 0a 20 20 20 20 20 20 20 20 20 22 6f 6b 22   ?.         "ok"
11f60 20 3a 20 22 66 61 69 6c 65 64 22 20 29 29 3b 0a   : "failed" ));.
11f70 20 0a 20 20 72 65 74 75 72 6e 20 28 20 20 20 28   .  return (   (
11f80 72 63 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  rc == INVALID_FI
11f90 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 0a  LE_ATTRIBUTES) .
11fa0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 72            && (er
11fb0 72 6f 72 20 3d 3d 20 45 52 52 4f 52 5f 46 49 4c  ror == ERROR_FIL
11fc0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 20  E_NOT_FOUND)) ? 
11fd0 53 51 4c 49 54 45 5f 4f 4b 20 3a 0a 20 20 20 20  SQLITE_OK :.    
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
11ff0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
12000 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 77  IOERR_DELETE, "w
12010 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
12020 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  name);.}../*.** 
12030 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 61  Check the exista
12040 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
12050 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
12060 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
12070 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
12080 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
12090 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
120a0 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
120b0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
120c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
120d0 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
120e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
120f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12100 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
12110 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
12120 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
12130 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
12140 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
12150 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
12160 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
12170 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
12180 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
12190 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
121a0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
121b0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
121c0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
121d0 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ; );.  zConverte
121e0 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
121f0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
12200 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
12210 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
12220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12230 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
12240 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 49 4e 33  NT() ){.    WIN3
12250 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
12260 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
12270 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
12280 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
12290 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
122a0 20 20 20 69 66 28 20 47 65 74 46 69 6c 65 41 74     if( GetFileAt
122b0 74 72 69 62 75 74 65 73 45 78 57 28 28 57 43 48  tributesExW((WCH
122c0 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  AR*)zConverted,.
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
122f0 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
12300 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rd, .           
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12320 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b    &sAttrData) ){
12330 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
12340 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
12350 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
12360 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
12370 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
12380 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
12390 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
123a0 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
123b0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
123c0 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
123d0 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
123e0 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
123f0 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
12400 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
12410 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
12420 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
12430 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
12440 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
12450 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
12460 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
12470 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
12480 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
12490 20 20 20 20 20 20 69 66 28 20 47 65 74 4c 61 73        if( GetLas
124a0 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f  tError()!=ERROR_
124b0 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  FILE_NOT_FOUND )
124c0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67  {.        winLog
124d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
124e0 52 52 5f 41 43 43 45 53 53 2c 20 22 77 69 6e 41  RR_ACCESS, "winA
124f0 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  ccess", zFilenam
12500 65 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  e);.        free
12510 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
12520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12530 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
12540 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12550 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
12560 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
12570 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20  BUTES;.      }. 
12580 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69     }./* isNT() i
12590 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
125a0 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
125b0 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
125c0 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
125d0 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
125e0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
125f0 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
12600 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
12610 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
12620 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
12630 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
12640 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
12650 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
12660 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
12670 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46  .    attr = GetF
12680 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
12690 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
126a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
126b0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
126c0 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
126d0 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
126e0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
126f0 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
12700 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
12710 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
12720 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
12730 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
12740 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12750 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
12760 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
12770 72 63 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c  rc = (attr & FIL
12780 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
12790 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
127a0 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
127b0 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
127c0 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
127d0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
127e0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
127f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12800 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12810 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
12820 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
12830 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
12840 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
12850 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
12860 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
12870 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
12880 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
12890 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
128a0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
128b0 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
128c0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
128d0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
128e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
128f0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
12900 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
12910 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
12920 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
12930 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
12940 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
12950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12960 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
12970 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
12980 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
12990 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
129a0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
129b0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
129c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
129d0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
129e0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
129f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
12a00 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12a10 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
12a20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66  cygwin_conv_to_f
12a30 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a  ull_win32_path(z
12a40 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29  Relative, zFull)
12a50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12a60 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
12a70 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12a80 45 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  E.  SimulateIOEr
12a90 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
12aa0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
12ab0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
12ac0 46 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43  Full);.  /* WinC
12ad0 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74  E has no concept
12ae0 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70   of a relative p
12af0 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49  athname, or so I
12b00 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73   am told. */.  s
12b10 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12b20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12b30 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
12b40 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74  Relative);.  ret
12b50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
12b60 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
12b70 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
12b80 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
12b90 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  __).  int nByte;
12ba0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
12bb0 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
12bc0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
12bd0 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
12be0 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
12bf0 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
12c00 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
12c10 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
12c20 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
12c30 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
12c40 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
12c50 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
12c60 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  ' && sqlite3Isal
12c70 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d  pha(zRelative[1]
12c80 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32  ) && zRelative[2
12c90 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52  ]==':' ){.    zR
12ca0 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
12cb0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
12cc0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
12cd0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
12ce0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
12cf0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
12d00 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
12d10 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
12d20 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
12d30 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
12d40 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
12d50 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
12d60 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
12d70 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
12d80 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
12d90 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
12da0 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
12db0 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
12dc0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
12dd0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
12de0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12df0 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a  ETER(nFull);.  z
12e00 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
12e10 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
12e20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
12e30 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
12e40 57 43 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20  WCHAR *zTemp;.  
12e50 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
12e60 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
12e70 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  R*)zConverted, 0
12e80 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
12e90 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28   zTemp = malloc(
12ea0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
12eb0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
12ec0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
12ed0 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65       free(zConve
12ee0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
12ef0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12f00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46  ;.    }.    GetF
12f10 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43  ullPathNameW((WC
12f20 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
12f30 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
12f40 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  );.    free(zCon
12f50 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
12f60 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  t = unicodeToUtf
12f70 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
12f80 65 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20 69 73  ee(zTemp);./* is
12f90 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
12fa0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
12fb0 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
12fc0 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
12fd0 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
12fe0 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
12ff0 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
13000 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
13010 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
13020 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
13030 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
13040 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
13050 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
13060 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
13070 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
13080 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
13090 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
130a0 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
130b0 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
130c0 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
130d0 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  = malloc( nByte*
130e0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
130f0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
13100 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  p==0 ){.      fr
13110 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
13120 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13130 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
13140 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68  .    GetFullPath
13150 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
13160 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
13170 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66  zTemp, 0);.    f
13180 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
13190 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
131a0 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
131b0 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
131c0 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a     free(zTemp);.
131d0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
131e0 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
131f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
13200 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
13210 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
13220 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75  t);.    free(zOu
13230 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
13240 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
13250 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
13260 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13270 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
13280 47 65 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  Get the sector s
13290 69 7a 65 20 6f 66 20 74 68 65 20 64 65 76 69 63  ize of the devic
132a0 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
132b0 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
132c0 69 63 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72  ic int getSector
132d0 53 69 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65  Size(.    sqlite
132e0 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20  3_vfs *pVfs,.   
132f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
13300 6c 61 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54  lative     /* UT
13310 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  F-8 file name */
13320 0a 29 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65  .){.  DWORD byte
13330 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c  sPerSector = SQL
13340 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
13350 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65  OR_SIZE;.  /* Ge
13360 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 20 69  tDiskFreeSpace i
13370 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
13380 75 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23  under WINCE */.#
13390 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
133a0 43 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  CE.  UNUSED_PARA
133b0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
133c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
133d0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73  zRelative);.#els
133e0 65 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61  e.  char zFullpa
133f0 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a  th[MAX_PATH+1];.
13400 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
13410 44 20 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44  D dwRet = 0;.  D
13420 57 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20  WORD dwDummy;.. 
13430 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64   /*.  ** We need
13440 20 74 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c   to get the full
13450 20 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68   path name of th
13460 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67  e file.  ** to g
13470 65 74 20 74 68 65 20 64 72 69 76 65 20 6c 65 74  et the drive let
13480 74 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74  ter to look up t
13490 68 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73  he sector.  ** s
134a0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ize..  */.  Simu
134b0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
134c0 6e 28 31 29 3b 0a 20 20 72 63 20 3d 20 77 69 6e  n(1);.  rc = win
134d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
134e0 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41  s, zRelative, MA
134f0 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74  X_PATH, zFullpat
13500 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  h);.  SimulateIO
13510 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
13520 20 20 69 66 28 20 72 63 20 3d 3d 20 53 51 4c 49    if( rc == SQLI
13530 54 45 5f 4f 4b 20 29 0a 20 20 7b 0a 20 20 20 20  TE_OK ).  {.    
13540 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
13550 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
13560 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 70 61 74 68  lename(zFullpath
13570 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e 76  );.    if( zConv
13580 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 69  erted ){.      i
13590 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
135a0 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74       /* trim pat
135b0 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20  h to just drive 
135c0 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20  reference */.   
135d0 20 20 20 20 20 57 43 48 41 52 20 2a 70 20 3d 20       WCHAR *p = 
135e0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
135f0 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29      for(;*p;p++)
13600 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13610 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20  *p == '\\' ){.  
13620 20 20 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27            *p = '
13630 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
13640 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13650 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
13660 20 20 20 20 20 20 64 77 52 65 74 20 3d 20 47 65        dwRet = Ge
13670 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 28  tDiskFreeSpaceW(
13680 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
13690 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a        &dwDummy,.
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 26 62 79 74 65 73 50 65 72 53 65 63 74 6f    &bytesPerSecto
136f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20   &dwDummy);.    
13750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13760 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f   /* trim path to
13770 20 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65   just drive refe
13780 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  rence */.       
13790 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
137a0 20 2a 29 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   *)zConverted;. 
137b0 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70         for(;*p;p
137c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
137d0 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b  f( *p == '\\' ){
137e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 20  .            *p 
137f0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
13800 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13820 0a 20 20 20 20 20 20 20 20 64 77 52 65 74 20 3d  .        dwRet =
13830 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63   GetDiskFreeSpac
13840 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
13850 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
13880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63      &bytesPerSec
138b0 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c         &dwDummy,
138e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20     &dwDummy);.  
13910 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
13920 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
13930 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 77 52    }.    if( !dwR
13940 65 74 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  et ){.      byte
13950 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c  sPerSector = SQL
13960 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
13970 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 20  OR_SIZE;.    }. 
13980 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
13990 72 6e 20 28 69 6e 74 29 20 62 79 74 65 73 50 65  rn (int) bytesPe
139a0 72 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23 69 66  rSector; .}..#if
139b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
139c0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
139d0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
139e0 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
139f0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
13a00 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
13a10 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
13a20 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
13a30 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
13a40 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
13a50 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ..*/./*.** Inter
13a60 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
13a70 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
13a80 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
13a90 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
13aa0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
13ab0 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
13ac0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
13ad0 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  brary..*/.static
13ae0 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e   void *winDlOpen
13af0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
13b00 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
13b10 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41  zFilename){.  HA
13b20 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a  NDLE h;.  void *
13b30 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
13b40 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
13b50 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55  (zFilename);.  U
13b60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13b70 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f  pVfs);.  if( zCo
13b80 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
13b90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
13ba0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
13bb0 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72      h = LoadLibr
13bc0 61 72 79 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  aryW((WCHAR*)zCo
13bd0 6e 76 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e  nverted);./* isN
13be0 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
13bf0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
13c00 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
13c10 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
13c20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53  .** Since the AS
13c30 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  CII version of t
13c40 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
13c50 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
13c60 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
13c70 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
13c80 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
13c90 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
13ca0 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
13cb0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
13cc0 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 4c 6f  else{.    h = Lo
13cd0 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
13ce0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
13cf0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65  endif.  }.  free
13d00 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
13d10 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
13d20 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
13d30 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
13d40 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
13d50 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
13d60 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
13d70 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
13d80 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  .  getLastErrorM
13d90 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  sg(nBuf, zBufOut
13da0 29 3b 0a 7d 0a 76 6f 69 64 20 28 2a 77 69 6e 44  );.}.void (*winD
13db0 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
13dc0 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
13dd0 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  andle, const cha
13de0 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69  r *zSymbol))(voi
13df0 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
13e00 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
13e10 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13e20 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
13e30 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
13e40 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
13e50 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65 2e  ilable on wince.
13e60 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   */.  return (vo
13e70 69 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50  id(*)(void))GetP
13e80 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e  rocAddressA((HAN
13e90 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79  DLE)pHandle, zSy
13ea0 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 2f  mbol);.#else.  /
13eb0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e 64  * All other wind
13ec0 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78  ows platforms ex
13ed0 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64 72  pect GetProcAddr
13ee0 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20  ess() to take.  
13ef0 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74 72 69 6e  ** an Ansi strin
13f00 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
13f10 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74  the _UNICODE set
13f20 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ting */.  return
13f30 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
13f40 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 28  GetProcAddress((
13f50 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20  HANDLE)pHandle, 
13f60 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69 66  zSymbol);.#endif
13f70 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  .}.void winDlClo
13f80 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
13f90 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
13fa0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
13fb0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
13fc0 20 20 46 72 65 65 4c 69 62 72 61 72 79 28 28 48    FreeLibrary((H
13fd0 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a  ANDLE)pHandle);.
13fe0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
13ff0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
14000 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
14010 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
14020 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
14030 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
14040 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
14050 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
14060 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
14070 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  e 0.#endif.../*.
14080 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
14090 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
140a0 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
140b0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
140c0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
140d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
140e0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
140f0 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e   *zBuf){.  int n
14100 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
14110 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
14120 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14130 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e  TE_TEST).  n = n
14140 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42  Buf;.  memset(zB
14150 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65  uf, 0, nBuf);.#e
14160 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
14170 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42  (SYSTEMTIME)<=nB
14180 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54  uf-n ){.    SYST
14190 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 47 65  EMTIME x;.    Ge
141a0 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
141b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
141c0 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
141d0 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
141e0 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
141f0 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
14200 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
14210 20 44 57 4f 52 44 20 70 69 64 20 3d 20 47 65 74   DWORD pid = Get
14220 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14230 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
14240 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73  zBuf[n], &pid, s
14250 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
14260 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64   n += sizeof(pid
14270 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
14280 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
14290 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
142a0 63 6e 74 20 3d 20 47 65 74 54 69 63 6b 43 6f 75  cnt = GetTickCou
142b0 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nt();.    memcpy
142c0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
142d0 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
142e0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
142f0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  nt);.  }.  if( s
14300 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45  izeof(LARGE_INTE
14310 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  GER)<=nBuf-n ){.
14320 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
14330 52 20 69 3b 0a 20 20 20 20 51 75 65 72 79 50 65  R i;.    QueryPe
14340 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
14350 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&i);.    memcpy
14360 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73  (&zBuf[n], &i, s
14370 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e  izeof(i));.    n
14380 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20   += sizeof(i);. 
14390 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
143a0 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
143b0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
143c0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
143d0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
143e0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  time slept..*/.s
143f0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65  tatic int winSle
14400 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
14410 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73  pVfs, int micros
14420 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28 6d 69  ec){.  Sleep((mi
14430 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
14440 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
14450 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
14460 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63  eturn ((microsec
14470 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30  +999)/1000)*1000
14480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
14490 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
144a0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
144b0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
144c0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
144d0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
144e0 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
144f0 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
14500 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
14510 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
14520 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
14530 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
14540 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14550 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
14560 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
14570 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
14580 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
14590 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
145a0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
145b0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
145c0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
145d0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
145e0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
145f0 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
14600 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
14610 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
14620 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
14630 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
14640 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
14650 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
14660 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
14670 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
14680 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
14690 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
146a0 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
146b0 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
146c0 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
146d0 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
146e0 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
146f0 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
14700 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
14710 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
14720 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
14730 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
14740 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
14750 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
14760 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
14770 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
14780 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
14790 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
147a0 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
147b0 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
147c0 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
147d0 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31  umber of .     1
147e0 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
147f0 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
14800 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
14810 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20   JD 2305813.5). 
14820 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
14830 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
14840 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
14850 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
14860 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
14870 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
14880 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
14890 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
148a0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
148b0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
148c0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
148d0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
148e0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
148f0 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
14900 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
14910 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
14920 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
14930 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
14940 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20  32BitValue = .  
14950 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
14960 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
14970 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
14980 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
14990 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36  ite3_int64)29496
149a0 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54  7296;..#if SQLIT
149b0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53  E_OS_WINCE.  SYS
149c0 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20  TEMTIME time;.  
149d0 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74  GetSystemTime(&t
149e0 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79  ime);.  /* if Sy
149f0 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
14a00 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72  me() fails, it r
14a10 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eturns zero. */.
14a20 20 20 69 66 20 28 21 53 79 73 74 65 6d 54 69 6d    if (!SystemTim
14a30 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
14a40 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74  e,&ft)){.    ret
14a50 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6c 73 65  urn 1;.  }.#else
14a60 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65  .  GetSystemTime
14a70 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
14a80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
14a90 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
14aa0 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
14ab0 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
14ac0 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
14ad0 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
14ae0 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20  itValue) + .    
14af0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
14b00 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c  te3_int64)ft.dwL
14b10 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c  owDateTime)/(sql
14b20 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30  ite3_int64)10000
14b30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
14b40 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
14b50 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
14b60 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
14b70 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
14b80 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
14b90 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
14ba0 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
14bb0 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
14bc0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
14bd0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
14be0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
14bf0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
14c00 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
14c10 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
14c20 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
14c30 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
14c40 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
14c50 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
14c60 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
14c70 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
14c80 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
14c90 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
14ca0 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  */.int winCurren
14cb0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
14cc0 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
14cd0 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
14ce0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
14cf0 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
14d00 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
14d10 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
14d20 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
14d30 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
14d40 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
14d50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
14d60 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
14d70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
14d80 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
14d90 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
14da0 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
14db0 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
14dc0 6e 20 77 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n windows (or er
14dd0 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
14de0 72 6f 72 5f 72 28 29 20 6f 6e 20 75 6e 69 78 29  ror_r() on unix)
14df0 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
14e00 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
14e10 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
14e20 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
14e30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
14e40 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
14e50 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
14e60 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
14e70 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
14e80 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
14e90 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
14ea0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
14eb0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
14ec0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
14ed0 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
14ee0 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
14ef0 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
14f00 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
14f10 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
14f20 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
14f30 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
14f40 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
14f50 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
14f60 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
14f70 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
14f80 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
14f90 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
14fa0 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
14fb0 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
14fc0 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
14fd0 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
14fe0 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
14ff0 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
15000 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
15010 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
15020 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
15030 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
15040 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
15050 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
15060 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
15070 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
15080 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
15090 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
150a0 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
150b0 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
150c0 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
150d0 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
150e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
150f0 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
15100 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
15110 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
15120 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
15130 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
15140 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
15150 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
15160 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
15170 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
15180 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
15190 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
151a0 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
151b0 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
151c0 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
151d0 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
151e0 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
151f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
15200 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
15210 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
15220 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
15230 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
15240 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
15250 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
15260 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
15270 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
15280 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
15290 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
152a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
152b0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
152c0 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72  urn getLastError
152d0 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 29 3b  Msg(nBuf, zBuf);
152e0 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  .}..../*.** Init
152f0 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
15300 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
15310 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
15320 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
15330 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
15340 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
15350 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
15360 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15380 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
15390 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
153a0 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
153b0 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41  le */.    MAX_PA
153c0 54 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  TH,            /
153d0 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
153e0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
153f0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
15400 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
15410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15420 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15440 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
15450 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
15460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
15470 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
15480 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
15490 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
154a0 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
154b0 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
154c0 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
154d0 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
154e0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
154f0 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
15500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
15510 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
15520 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
15530 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
15540 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
15550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
15560 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
15570 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
15580 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
15590 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
155a0 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
155b0 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
155c0 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
155d0 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
155e0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
155f0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
15600 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
15610 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
15620 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
15630 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
15640 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
15650 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
15660 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 30 2c  eInt64 */.    0,
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
15690 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Call */.    0,  
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156b0 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
156c0 6c 6c 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  ll */.    0,    
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
156e0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
156f0 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 23 69 66 6e 64  l */.  };..#ifnd
15700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
15710 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  AL.  /* get memo
15720 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
15730 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
15740 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
15750 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
15760 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
15770 20 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28    GetSystemInfo(
15780 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 20 20  &winSysInfo);.  
15790 61 73 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66  assert(winSysInf
157a0 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
157b0 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a  anularity > 0);.
157c0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
157d0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
157e0 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65  winVfs, 1);.  re
157f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
15800 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
15810 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
15820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15830 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
15840 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.