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

Artifact 24d72407a90551969744cf9bcbb1b4c72c5fa845:


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 2f 2a 0a 2a  .#endif.};../*.*
10f0: 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f 74  * Forward protot
1100: 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ypes..*/.static 
1110: 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a  int getSectorSiz
1120: 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e(.    sqlite3_v
1130: 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f  fs *pVfs,.    co
1140: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
1150: 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38  ive     /* UTF-8
1160: 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 3b   file name */.);
1170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
1180: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
1190: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
11a0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
11b0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
11c0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
11d0: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
11e0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
11f0: 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57  is Win95.** or W
1200: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
1210: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
1220: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
1230: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
1240: 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a  tem is Win95..**
1250: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
1260: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
1270: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
1280: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
1290: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
12a0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
12b0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
12c0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
12d0: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
12e0: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
12f0: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64  ehavior..*/.#ifd
1300: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
1310: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  nt sqlite3_os_ty
1320: 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  pe = 0;.#else.st
1330: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1340: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
1350: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1360: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
1370: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
1380: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
1390: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
13a0: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
13b0: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
13c0: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
13d0: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
13e0: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
13f0: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
1400: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
1410: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
1420: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
1430: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
1440: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
1450: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
1460: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
1470: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
1480: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
1490: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69   when running Wi
14a0: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
14b0: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
14c0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
14d0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
14e0: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
14f0: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
1500: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
1510: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
1520: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
1530: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
1540: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
1550: 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  () API..*/.#if S
1560: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
1570: 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20   define isNT()  
1580: 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74  (1).#else.  stat
1590: 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64  ic int isNT(void
15a0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
15b0: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b  e3_os_type==0 ){
15c0: 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  .      OSVERSION
15d0: 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20  INFO sInfo;.    
15e0: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
15f0: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
1600: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
1610: 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45 78 28     GetVersionEx(
1620: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  &sInfo);.      s
1630: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1640: 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72   sInfo.dwPlatfor
1650: 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52  mId==VER_PLATFOR
1660: 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a  M_WIN32_NT ? 2 :
1670: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
1680: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f  turn sqlite3_os_
1690: 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e  type==2;.  }.#en
16a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
16b0: 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINCE */../*.**
16c0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
16d0: 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72 6f   string to micro
16e0: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55 54  soft unicode (UT
16f0: 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53  F-16?). .**.** S
1700: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1710: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1720: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1730: 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61  m malloc..*/.sta
1740: 74 69 63 20 57 43 48 41 52 20 2a 75 74 66 38 54  tic WCHAR *utf8T
1750: 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  oUnicode(const c
1760: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1770: 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20  .  int nChar;.  
1780: 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c 65  WCHAR *zWideFile
1790: 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  name;..  nChar =
17a0: 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65   MultiByteToWide
17b0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
17c0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
17d0: 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69 64  NULL, 0);.  zWid
17e0: 65 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c  eFilename = mall
17f0: 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66  oc( nChar*sizeof
1800: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30  (zWideFilename[0
1810: 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64  ]) );.  if( zWid
1820: 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  eFilename==0 ){.
1830: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1840: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c 74  }.  nChar = Mult
1850: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
1860: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
1870: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
1880: 46 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72 29  Filename, nChar)
1890: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
18a0: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 57 69   ){.    free(zWi
18b0: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
18c0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
18d0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
18e0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
18f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
1900: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
1910: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
1920: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1930: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
1940: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
1950: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
1960: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
1970: 69 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73  icodeToUtf8(cons
1980: 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69  t WCHAR *zWideFi
1990: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
19a0: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
19b0: 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74  ilename;..  nByt
19c0: 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75  e = WideCharToMu
19d0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
19e0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
19f0: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
1a00: 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20  0);.  zFilename 
1a10: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  = malloc( nByte 
1a20: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
1a30: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1a40: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1a50: 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d  te = WideCharToM
1a60: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
1a70: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
1a80: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
1a90: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, 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 30 2c 20 30 29 3b 0a 20          0, 0);. 
1ac0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
1ad0: 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c  ){.    free(zFil
1ae0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
1af0: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
1b00: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
1b10: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
1b20: 65 72 74 20 61 6e 20 61 6e 73 69 20 73 74 72 69  ert an ansi stri
1b30: 6e 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74 20  ng to microsoft 
1b40: 75 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f  unicode, based o
1b50: 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  n the.** current
1b60: 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e   codepage settin
1b70: 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73  gs for file apis
1b80: 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74  ..** .** Space t
1b90: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
1ba0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
1bb0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d  tained.** from m
1bc0: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
1bd0: 20 57 43 48 41 52 20 2a 6d 62 63 73 54 6f 55 6e   WCHAR *mbcsToUn
1be0: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
1bf0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1c00: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 43 48  int nByte;.  WCH
1c10: 41 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  AR *zMbcsFilenam
1c20: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
1c30: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
1c40: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
1c50: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
1c60: 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54  yte = MultiByteT
1c70: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
1c80: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
1c90: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73 69  , -1, NULL,0)*si
1ca0: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 7a  zeof(WCHAR);.  z
1cb0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 6d  MbcsFilename = m
1cc0: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
1cd0: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
1ce0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
1cf0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
1d00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1d10: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 4d  .  }.  nByte = M
1d20: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
1d30: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
1d40: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
1d50: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  MbcsFilename, nB
1d60: 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  yte);.  if( nByt
1d70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65  e==0 ){.    free
1d80: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
1d90: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
1da0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
1db0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
1dc0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
1dd0: 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20 75  vert microsoft u
1de0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 62  nicode to multib
1df0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
1e00: 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74  ring, based on t
1e10: 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 6e 73  he.** user's Ans
1e20: 69 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a  i codepage..**.*
1e30: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
1e40: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
1e50: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
1e60: 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  from.** malloc()
1e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
1e80: 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28   *unicodeToMbcs(
1e90: 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57 69  const WCHAR *zWi
1ea0: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
1eb0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
1ec0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
1ed0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41 72  nt codepage = Ar
1ee0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
1ef0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
1f00: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
1f10: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
1f20: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
1f30: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
1f40: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
1f50: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6d  .  zFilename = m
1f60: 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a  alloc( nByte );.
1f70: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1f80: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f90: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
1fa0: 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  = WideCharToMult
1fb0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
1fc0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
1fd0: 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
1fe0: 20 6e 42 79 74 65 2c 0a 20 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 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
2010: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
2020: 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65 6e  .    free(zFilen
2030: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
2040: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
2050: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
2060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
2070: 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  t multibyte char
2080: 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20  acter string to 
2090: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
20a0: 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74   hold the.** ret
20b0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
20c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
20d0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
20e0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
20f0: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
2100: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2110: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
2120: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43 48  enameUtf8;.  WCH
2130: 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  AR *zTmpWide;.. 
2140: 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63 73   zTmpWide = mbcs
2150: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
2160: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
2170: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
2180: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
2190: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 75  FilenameUtf8 = u
21a0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d  nicodeToUtf8(zTm
21b0: 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a  pWide);.  free(z
21c0: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
21d0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
21e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
21f0: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
2200: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
2210: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
2220: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
2230: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
2240: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2250: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
2260: 74 69 63 20 63 68 61 72 20 2a 75 74 66 38 54 6f  tic char *utf8To
2270: 4d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  Mbcs(const char 
2280: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
2290: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
22a0: 63 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d  cs;.  WCHAR *zTm
22b0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
22c0: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
22d0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
22e0: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
22f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2300: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
2310: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54  eMbcs = unicodeT
2320: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
2330: 0a 20 20 66 72 65 65 28 7a 54 6d 70 57 69 64 65  .  free(zTmpWide
2340: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
2350: 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 23 69  enameMbcs;.}..#i
2360: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2370: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
2380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
23c0: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
23d0: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
23e0: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a  inCE only..*/./*
23f0: 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f  .** WindowsCE do
2400: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  es not have a lo
2410: 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
2420: 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61  on.  So create a
2430: 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a  .** substitute..
2440: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d  */.#include <tim
2450: 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
2460: 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
2470: 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
2480: 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
2490: 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
24a0: 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
24b0: 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
24c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
24d0: 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
24e0: 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
24f0: 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
2500: 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
2510: 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
2520: 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
2530: 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
2540: 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
2550: 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
2560: 32 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f  2);.  FileTimeTo
2570: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75  LocalFileTime(&u
2580: 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65  Tm,&lTm);.  File
2590: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
25a0: 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79  (&lTm,&pTm);.  y
25b0: 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77  .tm_year = pTm.w
25c0: 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79  Year - 1900;.  y
25d0: 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_mon = pTm.wM
25e0: 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d  onth - 1;.  y.tm
25f0: 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _wday = pTm.wDay
2600: 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d  OfWeek;.  y.tm_m
2610: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a  day = pTm.wDay;.
2620: 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54    y.tm_hour = pT
2630: 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f  m.wHour;.  y.tm_
2640: 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74  min = pTm.wMinut
2650: 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20  e;.  y.tm_sec = 
2660: 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72  pTm.wSecond;.  r
2670: 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20  eturn &y;.}../* 
2680: 54 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20  This will never 
2690: 62 65 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64  be called, but d
26a0: 65 66 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74  efined to make t
26b0: 68 65 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20  he code compile 
26c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65  */.#define GetTe
26d0: 6d 70 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64  mpPathA(a,b)..#d
26e0: 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61  efine LockFile(a
26f0: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20  ,b,c,d,e)       
2700: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61  winceLockFile(&a
2710: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64  , b, c, d, e).#d
2720: 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  efine UnlockFile
2730: 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20  (a,b,c,d,e)     
2740: 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
2750: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  &a, b, c, d, e).
2760: 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65  #define LockFile
2770: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
2780: 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45    winceLockFileE
2790: 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65  x(&a, b, c, d, e
27a0: 2c 20 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41  , f)..#define HA
27b0: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
27c0: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
27d0: 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f  char*)a)[-(int)o
27e0: 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c  ffsetof(winFile,
27f0: 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  h)]../*.** Acqui
2800: 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  re a lock on the
2810: 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61   handle h.*/.sta
2820: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75  tic void winceMu
2830: 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c  texAcquire(HANDL
2840: 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64  E h){.   DWORD d
2850: 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20  wErr;.   do {.  
2860: 20 20 20 64 77 45 72 72 20 3d 20 57 61 69 74 46     dwErr = WaitF
2870: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68  orSingleObject(h
2880: 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20  , INFINITE);.   
2890: 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21  } while (dwErr !
28a0: 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20  = WAIT_OBJECT_0 
28b0: 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54  && dwErr != WAIT
28c0: 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f  _ABANDONED);.}./
28d0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c  *.** Release a l
28e0: 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20  ock acquired by 
28f0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
2900: 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77  e().*/.#define w
2910: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
2920: 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78  (h) ReleaseMutex
2930: 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  (h)../*.** Creat
2940: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
2950: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73  shared memory us
2960: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69  ed for locking i
2970: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65  n the file.** de
2980: 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a  scriptor pFile.*
2990: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
29a0: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f  nceCreateLock(co
29b0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
29c0: 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46  ame, winFile *pF
29d0: 69 6c 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a  ile){.  WCHAR *z
29e0: 54 6f 6b 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4e  Tok;.  WCHAR *zN
29f0: 61 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ame = utf8ToUnic
2a00: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
2a10: 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54    BOOL bInit = T
2a20: 52 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  RUE;..  /* Initi
2a30: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
2a40: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 5a 65  lockdata */.  Ze
2a50: 72 6f 4d 65 6d 6f 72 79 28 26 70 46 69 6c 65 2d  roMemory(&pFile-
2a60: 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f 66 28 70  >local, sizeof(p
2a70: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a  File->local));..
2a80: 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65    /* Replace the
2a90: 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f   backslashes fro
2aa0: 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  m the filename a
2ab0: 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a  nd lowercase it.
2ac0: 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61    ** to derive a
2ad0: 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a   mutex name. */.
2ae0: 20 20 7a 54 6f 6b 20 3d 20 43 68 61 72 4c 6f 77    zTok = CharLow
2af0: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f  erW(zName);.  fo
2b00: 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b  r (;*zTok;zTok++
2b10: 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b  ){.    if (*zTok
2b20: 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20   == '\\') *zTok 
2b30: 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = '_';.  }..  /*
2b40: 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65   Create/open the
2b50: 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a   named mutex */.
2b60: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
2b70: 3d 20 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  = CreateMutexW(N
2b80: 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
2b90: 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
2ba0: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
2bb0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
2bc0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
2bd0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 6d 65  ;.    free(zName
2be0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  );.    return FA
2bf0: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  LSE;.  }..  /* A
2c00: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
2c10: 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
2c20: 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74  ng */.  winceMut
2c30: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
2c40: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f  >hMutex);.  .  /
2c50: 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65  * Since the name
2c60: 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78  s of named mutex
2c70: 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20  es, semaphores, 
2c80: 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74  file mappings et
2c90: 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65  c are .  ** case
2ca0: 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65  -sensitive, take
2cb0: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
2cc0: 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e  at by uppercasin
2cd0: 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65  g the mutex name
2ce0: 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20  .  ** and using 
2cf0: 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72  that as the shar
2d00: 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e  ed filemapping n
2d10: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61 72  ame..  */.  Char
2d20: 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  UpperW(zName);. 
2d30: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
2d40: 3d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  = CreateFileMapp
2d50: 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
2d60: 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
2d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41          PAGE_REA
2da0: 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f  DWRITE, 0, sizeo
2db0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20  f(winceLock),.  
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a       zName);  ..
2df0: 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20    /* Set a flag 
2e00: 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77  that indicates w
2e10: 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74  e're the first t
2e20: 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d  o create the mem
2e30: 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20  ory so it .  ** 
2e40: 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69  must be zero-ini
2e50: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66  tialized */.  if
2e60: 20 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29   (GetLastError()
2e70: 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44   == ERROR_ALREAD
2e80: 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62  Y_EXISTS){.    b
2e90: 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20  Init = FALSE;.  
2ea0: 7d 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d 65 29  }..  free(zName)
2eb0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75  ;..  /* If we su
2ec0: 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e  cceeded in makin
2ed0: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
2ee0: 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20  ory handle, map 
2ef0: 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  it. */.  if (pFi
2f00: 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20  le->hShared){.  
2f10: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20    pFile->shared 
2f20: 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 4d 61  = (winceLock*)Ma
2f30: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
2f40: 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20  e->hShared, .   
2f50: 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
2f60: 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
2f70: 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
2f80: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
2f90: 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
2fa0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
2fb0: 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
2fc0: 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
2fd0: 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
2fe0: 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f (!pFile->share
2ff0: 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
3000: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
3010: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
3020: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3030: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
3040: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
3050: 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
3060: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3070: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
3080: 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
3090: 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
30a0: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
30b0: 6c 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  l */.  if (pFile
30c0: 2d 3e 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c  ->hShared == NUL
30d0: 4c 29 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74  L){.    winceMut
30e0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
30f0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 43 6c  >hMutex);.    Cl
3100: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
3110: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
3120: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
3130: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46  LL;.    return F
3140: 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ALSE;.  }.  .  /
3150: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
3160: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
3170: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
3180: 20 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e   to */.  if (bIn
3190: 69 74 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d 65  it) {.    ZeroMe
31a0: 6d 6f 72 79 28 70 46 69 6c 65 2d 3e 73 68 61 72  mory(pFile->shar
31b0: 65 64 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65  ed, sizeof(wince
31c0: 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77  Lock));.  }..  w
31d0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
31e0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
31f0: 0a 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  .  return TRUE;.
3200: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
3210: 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e   the part of win
3220: 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20  File that deals 
3230: 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73  with wince locks
3240: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3250: 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
3260: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
3270: 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  {.  if (pFile->h
3280: 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41  Mutex){.    /* A
3290: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
32a0: 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
32b0: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
32c0: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >hMutex);..    /
32d0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
32e0: 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72  blocks should pr
32f0: 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e  obably assert in
3300: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74   debug mode, but
3310: 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65   they.       are
3320: 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63   to cleanup in c
3330: 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65  ase any locks re
3340: 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20  mained open */. 
3350: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
3360: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
3370: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
3380: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
3390: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
33a0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
33b0: 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46  erved){.      pF
33c0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
33d0: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
33e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
33f0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
3400: 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
3410: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
3420: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
3430: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
3440: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
3450: 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ve){.      pFile
3460: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3470: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
3480: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72    }..    /* De-r
3490: 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f  eference and clo
34a0: 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74  se our copy of t
34b0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
34c0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 55   handle */.    U
34d0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
34e0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
34f0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3500: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
3510: 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
3520: 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
3530: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
3540: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
3550: 65 78 29 3b 20 20 20 20 0a 20 20 20 20 43 6c 6f  ex);    .    Clo
3560: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
3570: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
3580: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
3590: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  L;.  }.}../* .**
35a0: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
35b0: 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
35c0: 6c 65 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64  le() API of wind
35d0: 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f  ows for wince.*/
35e0: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
35f0: 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41  ceLockFile(.  HA
3600: 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20  NDLE *phFile,.  
3610: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
3620: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
3630: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
3640: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
3650: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
3660: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
3670: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
3680: 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
3690: 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
36a0: 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
36b0: 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
36c0: 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
36d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36e0: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
36f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
3700: 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
3710: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
3720: 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
3730: 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
3740: 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
3750: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
3760: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
3770: 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
3780: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
3790: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
37a0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
37b0: 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
37c0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
37d0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
37e0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
37f0: 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
3800: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
3810: 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
3820: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
3830: 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
3840: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3850: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
3860: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
3870: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
3880: 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
3890: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
38a0: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
38b0: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
38c0: 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
38d0: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
38e0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
38f0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
3900: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
3910: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
3920: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
3930: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
3940: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
3950: 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
3960: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
3970: 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
3980: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
3990: 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
39a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
39b0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
39c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
39d0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
39e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
39f0: 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
3a00: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
3a10: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
3a20: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
3a30: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
3a40: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
3a50: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f  Low == 1){.    /
3a60: 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20  * If no pending 
3a70: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63  lock has been ac
3a80: 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71  quired, then acq
3a90: 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  uire it */.    i
3aa0: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
3ab0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29  ->bPending == 0)
3ac0: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
3ad0: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
3ae0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70   = TRUE;.      p
3af0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
3b00: 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20  ding = TRUE;.   
3b10: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
3b20: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
3b30: 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76  /* Want a reserv
3b40: 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ed lock? */.  el
3b50: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
3b60: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
3b70: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26  )RESERVED_BYTE &
3b80: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3b90: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3ba0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3bb0: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
3bc0: 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
3bd0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
3be0: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
3bf0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
3c00: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
3c10: 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
3c20: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
3c30: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
3c40: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
3c50: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
3c60: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
3c70: 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
3c80: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
3c90: 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
3ca0: 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e   windows for win
3cb0: 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  ce.*/.static BOO
3cc0: 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c  L winceUnlockFil
3cd0: 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46  e(.  HANDLE *phF
3ce0: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
3cf0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
3d00: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
3d10: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
3d20: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3d30: 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  UnlockLow,.  DWO
3d40: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
3d50: 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b  sToUnlockHigh.){
3d60: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
3d70: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
3d80: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
3d90: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
3da0: 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
3db0: 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
3dc0: 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
3dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3de0: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
3df0: 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  oUnlockHigh);.. 
3e00: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
3e10: 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
3e20: 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
3e30: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
3e40: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  tex);..  /* Rele
3e50: 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c  asing a reader l
3e60: 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  ock or an exclus
3e70: 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  ive lock */.  if
3e80: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
3e90: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
3ea0: 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f  ED_FIRST){.    /
3eb0: 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e  * Did we have an
3ec0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
3ed0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
3ee0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
3ef0: 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ive){.      asse
3f00: 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
3f10: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
3f20: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
3f30: 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ZE);.      pFile
3f40: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
3f50: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
3f60: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
3f70: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
3f80: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
3f90: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
3fa0: 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  ..    /* Did we 
3fb0: 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64  just have a read
3fc0: 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  er lock? */.    
3fd0: 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e  else if (pFile->
3fe0: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
3ff0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
4000: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
4010: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
4020: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c  D)SHARED_SIZE ||
4030: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
4040: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
4050: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
4060: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d  ocal.nReaders --
4070: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
4080: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
4090: 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
40a0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
40b0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
40c0: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
40d0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
40f0: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65  * Releasing a pe
4100: 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
4110: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
4120: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
4130: 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  RD)PENDING_BYTE 
4140: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
4150: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
4160: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
4170: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
4180: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
4190: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
41a0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
41b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
41c0: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
41d0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
41e0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
41f0: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
4200: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
4210: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
4220: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
4230: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
4240: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
4250: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
4260: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
4270: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
4280: 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20  eserved) {.     
4290: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
42a0: 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
42b0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
42c0: 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
42d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
42e0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
42f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63     }.  }..  winc
4300: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
4310: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
4320: 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a  return bReturn;.
4330: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c  }../*.** An impl
4340: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
4350: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
4360: 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f  PI of windows fo
4370: 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  r wince.*/.stati
4380: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
4390: 46 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c 45  FileEx(.  HANDLE
43a0: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
43b0: 44 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57 4f  D dwFlags,.  DWO
43c0: 52 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a 20  RD dwReserved,. 
43d0: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
43e0: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
43f0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
4400: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
4410: 2c 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44  ,.  LPOVERLAPPED
4420: 20 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29 7b   lpOverlapped.){
4430: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
4440: 54 45 52 28 64 77 52 65 73 65 72 76 65 64 29 3b  TER(dwReserved);
4450: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
4460: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
4470: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
4480: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    /* If the call
4490: 65 72 20 77 61 6e 74 73 20 61 20 73 68 61 72 65  er wants a share
44a0: 64 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f 72  d read lock, for
44b0: 77 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a 20  ward this call. 
44c0: 20 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63 6b   ** to winceLock
44d0: 46 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c 70  File */.  if (lp
44e0: 4f 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66 73  Overlapped->Offs
44f0: 65 74 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  et == (DWORD)SHA
4500: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
4510: 20 20 20 64 77 46 6c 61 67 73 20 3d 3d 20 31 20     dwFlags == 1 
4520: 26 26 0a 20 20 20 20 20 20 6e 4e 75 6d 62 65 72  &&.      nNumber
4530: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
4540: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
4550: 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72 65 74  D_SIZE){.    ret
4560: 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
4570: 65 28 70 68 46 69 6c 65 2c 20 53 48 41 52 45 44  e(phFile, SHARED
4580: 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
4590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46  ;.  }.  return F
45a0: 41 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e  ALSE;.}./*.** En
45b0: 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  d of the special
45c0: 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a   code for wince.
45d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
4620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4630: 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a  OS_WINCE */../**
4640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
4690: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
46a0: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
46b0: 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
46c0: 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
46d0: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
46e0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
46f0: 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
4700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4740: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d  */../*.** Some m
4750: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
4760: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
4770: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
4780: 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
4790: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
47a0: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
47b0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
47c0: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
47d0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
47e0: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
47f0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
4800: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
4810: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
4820: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
4830: 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
4840: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
4850: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
4860: 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
4870: 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
4880: 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
4890: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
48a0: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69  tatic int seekWi
48b0: 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  nFile(winFile *p
48c0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
48d0: 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 20 20  t64 iOffset){.  
48e0: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
4910: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
4920: 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
4930: 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
4940: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
4950: 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
4960: 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
4970: 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
49a0: 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
49b0: 6e 74 65 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70  nter() */..  upp
49c0: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
49d0: 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  (iOffset>>32) & 
49e0: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c  0x7fffffff);.  l
49f0: 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  owerBits = (LONG
4a00: 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66  )(iOffset & 0xff
4a10: 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41  ffffff);..  /* A
4a20: 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75  PI oddity: If su
4a30: 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c  ccessful, SetFil
4a40: 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72  ePointer() retur
4a50: 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a  ns a dword .  **
4a60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4a70: 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
4a80: 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
4a90: 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
4aa0: 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
4ab0: 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
4ac0: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
4ad0: 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
4ae0: 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a  ng to MSDN, .  *
4af0: 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
4b00: 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
4b10: 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
4b20: 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
4b30: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
4b40: 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
4b50: 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
4b60: 63 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c  ccured, it is al
4b70: 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
4b80: 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
4b90: 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
4ba0: 20 20 64 77 52 65 74 20 3d 20 53 65 74 46 69 6c    dwRet = SetFil
4bb0: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
4bc0: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
4bd0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
4be0: 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 28 64 77  EGIN);.  if( (dw
4bf0: 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54  Ret==INVALID_SET
4c00: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26  _FILE_POINTER &&
4c10: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21   GetLastError()!
4c20: 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20  =NO_ERROR) ){.  
4c30: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
4c40: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
4c50: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
4c60: 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
4c70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
4c80: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
4c90: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
4ca0: 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
4cb0: 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
4cc0: 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
4cd0: 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
4ce0: 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
4cf0: 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
4d00: 62 75 74 20 77 69 6e 64 6f 77 73 20 69 73 20 6e  but windows is n
4d10: 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
4d20: 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
4d30: 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
4d40: 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
4d50: 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
4d60: 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
4d70: 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
4d80: 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
4d90: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
4da0: 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
4db0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
4dc0: 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
4dd0: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
4de0: 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
4df0: 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
4e00: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
4e10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
4e20: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
4e30: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
4e40: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
4e50: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
4e60: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
4e70: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
4e80: 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
4e90: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
4ea0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
4eb0: 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  pShm==0 );.  OST
4ec0: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
4ed0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
4ee0: 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 43    do{.    rc = C
4ef0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
4f00: 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
4f10: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
4f20: 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
4f30: 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
4f40: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
4f50: 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
4f60: 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
4f70: 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  Sleep(100), 1) )
4f80: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
4f90: 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49  WINCE.#define WI
4fa0: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
4fb0: 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44  EMPTS 3.  winceD
4fc0: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
4fd0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
4fe0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
4ff0: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
5000: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
5010: 20 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46           DeleteF
5020: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
5030: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
5040: 20 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c         && GetFil
5050: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
5060: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
5070: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
5080: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
5090: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
50a0: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
50b0: 29 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28  ){.       Sleep(
50c0: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
50d0: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
50e0: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
50f0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46     }.    free(pF
5100: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
5110: 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ose);.  }.#endif
5120: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
5130: 53 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  SE %d %s\n", pFi
5140: 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
5150: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
5160: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
5170: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
5180: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49  SQLITE_OK : SQLI
5190: 54 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_IOERR;.}../*.
51a0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
51b0: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
51c0: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
51d0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
51e0: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
51f0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
5200: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
5210: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
5220: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
5230: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
5240: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
5250: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
5260: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
5270: 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
5280: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
5290: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
52a0: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
52b0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
52c0: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
52d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
52e0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
52f0: 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
5300: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
5310: 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
5320: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
5330: 65 74 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  et */.){.  winFi
5340: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
5350: 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
5360: 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
5370: 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5390: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
53a0: 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
53b0: 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  from file */..  
53c0: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
53d0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
53e0: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
53f0: 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
5400: 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 25  OSTRACE(("READ %
5410: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
5420: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
5430: 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 69 66  ocktype));..  if
5440: 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  ( seekWinFile(pF
5450: 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
5460: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5470: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 69 66  E_FULL;.  }.  if
5480: 28 20 21 52 65 61 64 46 69 6c 65 28 70 46 69 6c  ( !ReadFile(pFil
5490: 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
54a0: 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 20   &nRead, 0) ){. 
54b0: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
54c0: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
54d0: 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  or();.    return
54e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
54f0: 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  AD;.  }.  if( nR
5500: 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
5510: 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
5520: 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
5530: 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
5540: 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
5550: 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
5560: 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
5570: 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
5580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
5590: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
55a0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
55b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
55c0: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
55d0: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
55e0: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
55f0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5600: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
5610: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
5620: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
5630: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
5640: 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
5650: 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
5660: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
5670: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
5680: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
5690: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
56a0: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74    /* The bytes t
56b0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
56c0: 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
56f0: 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
5700: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
5710: 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   offset         
5720: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
5730: 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
5740: 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
5750: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5780: 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  f error has occu
5790: 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
57a0: 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
57b0: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
57c0: 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
57d0: 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
57e0: 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73  ( amt>0 );.  ass
57f0: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
5800: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
5810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
5820: 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69  ERR_WRITE);.  Si
5830: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
5840: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
5850: 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52  E_FULL);..  OSTR
5860: 41 43 45 28 28 22 57 52 49 54 45 20 25 64 20 6c  ACE(("WRITE %d l
5870: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
5880: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
5890: 74 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d 20  type));..  rc = 
58a0: 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
58b0: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  e, offset);.  if
58c0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  ( rc==0 ){.    u
58d0: 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
58e0: 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
58f0: 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
5900: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
5910: 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
5920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5930: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
5940: 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
5950: 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
5960: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
5970: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
5980: 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
5990: 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
59a0: 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  */..    while( n
59b0: 52 65 6d 3e 30 20 26 26 20 57 72 69 74 65 46 69  Rem>0 && WriteFi
59c0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
59d0: 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
59e0: 2c 20 30 29 20 26 26 20 6e 57 72 69 74 65 3e 30  , 0) && nWrite>0
59f0: 20 29 7b 0a 20 20 20 20 20 20 61 52 65 6d 20 2b   ){.      aRem +
5a00: 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
5a10: 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
5a20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
5a30: 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
5a40: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
5a50: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
5a60: 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
5a70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
5a80: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  rc ){.    if( pF
5a90: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
5aa0: 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53  ERROR_HANDLE_DIS
5ab0: 4b 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  K_FULL ){.      
5ac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
5ad0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
5ae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
5af0: 52 5f 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  R_WRITE;.  }.  r
5b00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5b10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
5b20: 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
5b30: 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
5b40: 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
5b50: 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71  t winTruncate(sq
5b60: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
5b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
5b80: 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  yte){.  winFile 
5b90: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5ba0: 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
5bb0: 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  handle object */
5bc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5bd0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
5be0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
5bf0: 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  e for this funct
5c00: 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
5c10: 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53  ( pFile );..  OS
5c20: 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
5c30: 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69   %d %lld\n", pFi
5c40: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a  le->h, nByte));.
5c50: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
5c60: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
5c70: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
5c80: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
5c90: 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
5ca0: 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
5cb0: 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
5cc0: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
5cd0: 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
5ce0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
5cf0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
5d00: 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
5d10: 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
5d20: 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
5d30: 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
5d40: 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
5d50: 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
5d60: 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
5d70: 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
5d80: 6e 6b 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  nk ){.    nByte 
5d90: 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
5da0: 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
5db0: 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
5dc0: 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
5dd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
5de0: 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
5df0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
5e00: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
5e10: 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
5e20: 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ls. */.  if( see
5e30: 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
5e40: 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
5e50: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
5e60: 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 65 6c 73  TRUNCATE;.  }els
5e70: 65 20 69 66 28 20 30 3d 3d 53 65 74 45 6e 64 4f  e if( 0==SetEndO
5e80: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
5e90: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
5ea0: 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
5eb0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63  tError();.    rc
5ec0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
5ed0: 54 52 55 4e 43 41 54 45 3b 0a 20 20 7d 0a 0a 20  TRUNCATE;.  }.. 
5ee0: 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
5ef0: 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e  ATE %d %lld %s\n
5f00: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  ", pFile->h, nBy
5f10: 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64  te, rc ? "failed
5f20: 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65  " : "ok"));.  re
5f30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
5f40: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
5f50: 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
5f60: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
5f70: 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
5f80: 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
5f90: 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
5fa0: 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
5fb0: 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
5fc0: 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
5fd0: 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
5fe0: 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
5ff0: 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
6000: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
6010: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
6020: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
6030: 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
6040: 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
6050: 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
6060: 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
6070: 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69  int winSync(sqli
6080: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
6090: 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 20 21 64  t flags){.#if !d
60a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
60b0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
60c0: 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 64 65  E_NO_SYNC) || de
60d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
60e0: 55 47 29 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  UG).  winFile *p
60f0: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
6100: 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  )id;.#else.  UNU
6110: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
6120: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
6130: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
6140: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
6150: 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
6160: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
6170: 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
6180: 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
6190: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
61a0: 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
61b0: 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
61c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
61d0: 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28    );..  OSTRACE(
61e0: 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25  ("SYNC %d lock=%
61f0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
6200: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
6210: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
6220: 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44  TE_TEST.  UNUSED
6230: 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73  _PARAMETER(flags
6240: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 66  );.#else.  if( f
6250: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 59  lags & SQLITE_SY
6260: 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
6270: 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
6280: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
6290: 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
62a0: 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
62b0: 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
62c0: 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
62d0: 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
62e0: 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
62f0: 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
6300: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
6310: 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
6320: 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
6330: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
6340: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
6350: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
6360: 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 53 69 6d  TE_FULL );.  Sim
6370: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
6380: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
6390: 52 3b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  R; );..  /* If w
63a0: 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
63b0: 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
63c0: 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
63d0: 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
63e0: 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
63f0: 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
6400: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6410: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  _OK;.#else.  if(
6420: 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72   FlushFileBuffer
6430: 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  s(pFile->h) ){. 
6440: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6450: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
6460: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
6470: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
6480: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
6490: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
64a0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
64b0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
64c0: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
64d0: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
64e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
64f0: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
6500: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
6510: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
6520: 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  ){.  DWORD upper
6530: 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f  Bits;.  DWORD lo
6540: 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69  werBits;.  winFi
6550: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
6560: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
6570: 44 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65  D error;..  asse
6580: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
6590: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
65a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
65b0: 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77  RR_FSTAT);.  low
65c0: 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65  erBits = GetFile
65d0: 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
65e0: 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 66  upperBits);.  if
65f0: 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d  (   (lowerBits =
6600: 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53  = INVALID_FILE_S
6610: 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 65  IZE).     && ((e
6620: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
6630: 72 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52  ror()) != NO_ERR
6640: 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70 46  OR) ).  {.    pF
6650: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
6660: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
6670: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
6680: 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
6690: 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
66a0: 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
66b0: 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
66c0: 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ts;.  return SQL
66d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
66e0: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
66f0: 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
6700: 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
6710: 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
6720: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
6730: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
6740: 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
6750: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
6760: 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
6770: 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
6780: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
6790: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
67a0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
67b0: 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
67c0: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
67d0: 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
67e0: 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  5 or WinNT..*/.s
67f0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
6800: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
6810: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
6820: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
6830: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
6840: 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e   ovlp;.    ovlp.
6850: 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f  Offset = SHARED_
6860: 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e  FIRST;.    ovlp.
6870: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a  OffsetHigh = 0;.
6880: 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20      ovlp.hEvent 
6890: 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  = 0;.    res = L
68a0: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
68b0: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
68c0: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20  L_IMMEDIATELY,. 
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68e0: 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49      0, SHARED_SI
68f0: 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f  ZE, 0, &ovlp);./
6900: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
6910: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
6920: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
6930: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
6940: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
6950: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
6960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
6970: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
6980: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
6990: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
69a0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
69b0: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
69c0: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
69d0: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
69e0: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
69f0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
6a00: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6a10: 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
6a20: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
6a30: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
6a40: 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
6a50: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
6a60: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
6a70: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
6a80: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
6a90: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
6aa0: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
6ab0: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
6ac0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
6ad0: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
6ae0: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
6af0: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
6b00: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
6b10: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
6b20: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69  D_SIZE, 0);./* i
6b30: 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
6b40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
6b50: 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
6b60: 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
6b70: 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  . .*/.#if SQLITE
6b80: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
6b90: 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
6ba0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
6bb0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6bc0: 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  T + pFile->share
6bd0: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
6be0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
6bf0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
6c00: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
6c10: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
6c20: 45 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  Error();.  }.  r
6c30: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
6c40: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
6c50: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
6c60: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
6c70: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
6c80: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
6c90: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
6ca0: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
6cb0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
6cc0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
6cd0: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
6ce0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
6cf0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
6d00: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
6d10: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
6d20: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
6d30: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
6d40: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
6d50: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
6d60: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
6d70: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
6d80: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
6d90: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
6da0: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
6db0: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
6dc0: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
6dd0: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
6de0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
6df0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
6e00: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
6e10: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
6e20: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
6e30: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
6e40: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
6e50: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
6e60: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
6e70: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
6e80: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
6e90: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
6ea0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
6eb0: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
6ec0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
6ed0: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
6ee0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
6ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6f00: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
6f10: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
6f20: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
6f30: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
6f40: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
6f50: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
6f60: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
6f70: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
6f80: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
6f90: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
6fa0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
6fb0: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
6fc0: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
6fd0: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
6fe0: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
6ff0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
7000: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
7010: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
7020: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
7030: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7040: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
7050: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
7060: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
7070: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
7080: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77  /* Result of a w
7090: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
70a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
70b0: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
70c0: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
70d0: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
70e0: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
70f0: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
7100: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
7110: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
7120: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
7130: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
7140: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
7150: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
7160: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d  .  DWORD error =
7170: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
7180: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
7190: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
71a0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
71b0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
71c0: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
71d0: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
71e0: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
71f0: 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20  edLockByte));.. 
7200: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
7210: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
7220: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
7230: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
7240: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
7250: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
7260: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
7270: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
7280: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
7290: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
72a0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
72b0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
72c0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
72d0: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
72e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
72f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
7300: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
7310: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
7320: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
7330: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
7340: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
7350: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
7360: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
7370: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
7380: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
7390: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
73a0: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
73b0: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
73c0: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
73d0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
73e0: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
73f0: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
7400: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
7410: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
7420: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
7430: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
7440: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
7450: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
7460: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
7470: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
7480: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
7490: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
74a0: 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
74b0: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
74c0: 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
74d0: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
74e0: 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
74f0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
7500: 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
7510: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
7520: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
7530: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
7540: 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
7550: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
7560: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
7570: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
7580: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
7590: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
75a0: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
75b0: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
75c0: 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e  ock.  The pendin
75d0: 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a  g lock might be.
75e0: 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79        ** held by
75f0: 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20   another reader 
7600: 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c  process who will
7610: 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65   release it mome
7620: 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a  ntarily..      *
7630: 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
7640: 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
7650: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
7660: 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
7670: 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29  ;.      Sleep(1)
7680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
7690: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
76a0: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
76b0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
76c0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
76d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
76e0: 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
76f0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
7700: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
7710: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
7720: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
7730: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
7740: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
7750: 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70   = getReadLock(p
7760: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
7770: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7780: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
7790: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
77a0: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
77b0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
77c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
77d0: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
77e0: 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
77f0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
7800: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
7810: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
7820: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
7830: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
7840: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
7850: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
7860: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
7870: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
7880: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7890: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
78a0: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
78b0: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
78c0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
78d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
78e0: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
78f0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
7900: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
7910: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
7920: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
7930: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
7940: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
7950: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
7960: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
7970: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
7980: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
7990: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
79a0: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
79b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
79c0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
79d0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
79e0: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
79f0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
7a00: 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65    OSTRACE(("unre
7a10: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
7a20: 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  res));.    res =
7a30: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
7a40: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
7a50: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
7a60: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
7a70: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
7a80: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
7a90: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
7aa0: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7ab0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7ac0: 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
7ad0: 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25  ("error-code = %
7ae0: 64 5c 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20  d\n", error));. 
7af0: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
7b00: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
7b10: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
7b20: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
7b30: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
7b40: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
7b50: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
7b60: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
7b70: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
7b80: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
7b90: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
7ba0: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7bb0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
7bc0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
7bd0: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
7be0: 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
7bf0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
7c00: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
7c10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
7c20: 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
7c30: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
7c40: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
7c50: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
7c60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7c70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
7c80: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49  TRACE(("LOCK FAI
7c90: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
7ca0: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
7cb0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
7cc0: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
7cd0: 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
7ce0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
7cf0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
7d00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7d10: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  BUSY;.  }.  pFil
7d20: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
7d30: 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
7d40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7d50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7d60: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
7d70: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
7d80: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
7d90: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
7da0: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
7db0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
7dc0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
7dd0: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
7de0: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
7df0: 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
7e00: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
7e10: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
7e20: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
7e30: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
7e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
7e50: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
7e60: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
7e70: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
7e80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7e90: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
7ea0: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
7eb0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
7ec0: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
7ed0: 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
7ee0: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  CK ){.    rc = 1
7ef0: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
7f00: 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
7f10: 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
7f20: 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
7f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7f40: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
7f50: 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
7f60: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
7f70: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
7f80: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
7f90: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
7fa0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
7fb0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72     }.    rc = !r
7fc0: 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  c;.    OSTRACE((
7fd0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
7fe0: 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c   %d (remote)\n",
7ff0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
8000: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
8010: 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53  = rc;.  return S
8020: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8030: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
8040: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
8050: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64  le descriptor id
8060: 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c   to locktype.  l
8070: 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20  ocktype.** must 
8080: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
8090: 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
80a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
80b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
80c0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
80d0: 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
80e0: 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
80f0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
8100: 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
8110: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
8120: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  op..**.** It is 
8130: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
8140: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
8150: 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63   fail if the sec
8160: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
8170: 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20  is NO_LOCK.  If 
8180: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8190: 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f  ent is SHARED_LO
81a0: 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  CK then this rou
81b0: 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65  tine.** might re
81c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
81d0: 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  R;.*/.static int
81e0: 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   winUnlock(sqlit
81f0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
8200: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
8210: 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c  t type;.  winFil
8220: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
8230: 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
8240: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8250: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
8260: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  0 );.  assert( l
8270: 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f  ocktype<=SHARED_
8280: 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43  LOCK );.  OSTRAC
8290: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f  E(("UNLOCK %d to
82a0: 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e   %d was %d(%d)\n
82b0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63  ", pFile->h, loc
82c0: 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20  ktype,.         
82d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
82e0: 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  , pFile->sharedL
82f0: 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70  ockByte));.  typ
8300: 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
8310: 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e  ype;.  if( type>
8320: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
8330: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
8340: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
8350: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
8360: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
8370: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
8380: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
8390: 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  getReadLock(pFil
83a0: 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  e) ){.      /* T
83b0: 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  his should never
83c0: 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f   happen.  We sho
83d0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62  uld always be ab
83e0: 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72  le to.      ** r
83f0: 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
8400: 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
8410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
8420: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  R_UNLOCK;.    }.
8430: 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
8440: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
8450: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
8460: 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
8470: 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
8480: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  );.  }.  if( loc
8490: 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  ktype==NO_LOCK &
84a0: 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  & type>=SHARED_L
84b0: 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  OCK ){.    unloc
84c0: 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
84d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  ;.  }.  if( type
84e0: 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
84f0: 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65  {.    UnlockFile
8500: 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  (pFile->h, PENDI
8510: 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
8520: 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
8530: 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c  locktype = (u8)l
8540: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
8550: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
8560: 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79  ontrol and query
8570: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
8580: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
8590: 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43  tic int winFileC
85a0: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
85b0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
85c0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
85d0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
85e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
85f0: 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
8600: 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
8610: 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29  rg = ((winFile*)
8620: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  id)->locktype;. 
8630: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8640: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
8650: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
8660: 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
8670: 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
8680: 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a 29 69  int)((winFile*)i
8690: 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  d)->lastErrno;. 
86a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
86b0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
86c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
86d0: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
86e0: 0a 20 20 20 20 20 20 28 28 77 69 6e 46 69 6c 65  .      ((winFile
86f0: 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d  *)id)->szChunk =
8700: 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
8710: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8720: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
8730: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
8740: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
8750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
8760: 74 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74  t64 sz = *(sqlit
8770: 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
8780: 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
8790: 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
87a0: 20 20 20 20 20 20 77 69 6e 54 72 75 6e 63 61 74        winTruncat
87b0: 65 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20  e(id, sz);.     
87c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
87d0: 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
87e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
87f0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
8800: 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
8810: 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20  YNC_OMITTED: {. 
8820: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8830: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
8840: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8850: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
8860: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
8870: 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
8880: 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
8890: 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
88a0: 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
88b0: 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
88c0: 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
88d0: 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
88e0: 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
88f0: 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
8900: 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
8910: 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
8920: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
8930: 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
8940: 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
8950: 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
8960: 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
8970: 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
8980: 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
8990: 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
89a0: 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
89b0: 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
89c0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
89d0: 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
89e0: 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74   for both..*/.st
89f0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74  atic int winSect
8a00: 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
8a10: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73 73 65  ile *id){.  asse
8a20: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 72  rt( id!=0 );.  r
8a30: 65 74 75 72 6e 20 28 69 6e 74 29 28 28 28 77 69  eturn (int)(((wi
8a40: 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 73 65 63 74  nFile*)id)->sect
8a50: 6f 72 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  orSize);.}../*.*
8a60: 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f  * Return a vecto
8a70: 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72  r of device char
8a80: 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a  acteristics..*/.
8a90: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
8aa0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
8ab0: 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
8ac0: 20 2a 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f   *id){.  UNUSED_
8ad0: 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20  PARAMETER(id);. 
8ae0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
8af0: 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
8b00: 5f 57 48 45 4e 5f 4f 50 45 4e 3b 0a 7d 0a 0a 23  _WHEN_OPEN;.}..#
8b10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8b20: 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57  IT_WAL../* .** W
8b30: 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
8b40: 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
8b50: 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
8b60: 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
8b70: 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
8b80: 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
8b90: 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
8ba0: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
8bb0: 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
8bc0: 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
8bd0: 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
8be0: 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49  ize..*/.SYSTEM_I
8bf0: 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a  NFO winSysInfo;.
8c00: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
8c10: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
8c20: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
8c30: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
8c40: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
8c50: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
8c60: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
8c70: 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
8c80: 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  s used by .** th
8c90: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
8ca0: 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
8cb0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
8cc0: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
8cd0: 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
8ce0: 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
8cf0: 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
8d00: 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
8d10: 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
8d20: 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
8d30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
8d40: 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
8d50: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
8d60: 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
8d70: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
8d80: 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
8d90: 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
8da0: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
8db0: 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
8dc0: 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
8dd0: 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
8de0: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
8df0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8e00: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
8e10: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
8e20: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
8e30: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
8e40: 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
8e50: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
8e60: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
8e70: 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
8e80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
8e90: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
8ea0: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
8eb0: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
8ec0: 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
8ed0: 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
8ee0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
8ef0: 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
8f00: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
8f10: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
8f20: 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
8f30: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
8f40: 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
8f50: 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
8f60: 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
8f70: 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
8f80: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
8f90: 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
8fa0: 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
8fb0: 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
8fc0: 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
8fd0: 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
8fe0: 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
8ff0: 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
9000: 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
9010: 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
9020: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
9030: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9040: 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
9050: 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
9060: 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
9070: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
9080: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
9090: 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
90a0: 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
90b0: 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
90c0: 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
90d0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
90e0: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
90f0: 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
9100: 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
9110: 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pNext .**.** The
9120: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
9130: 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
9140: 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
9150: 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
9160: 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
9170: 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
9180: 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53  *.** Either winS
9190: 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
91a0: 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e  t be held or win
91b0: 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
91c0: 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  and.** winShmMut
91d0: 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
91e0: 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
91f0: 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
9200: 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
9210: 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
9220: 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  *.*/.struct winS
9230: 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74  hmNode {.  sqlit
9240: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
9250: 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
9260: 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
9270: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
9280: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
9290: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
92a0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  the file */.  wi
92b0: 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20  nFile hFile;    
92c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
92d0: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e   handle from win
92e0: 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73  Open */..  int s
92f0: 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
9300: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9310: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
9320: 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
9330: 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
9340: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9350: 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
9360: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d   */.  struct Shm
9370: 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e  Region {.    HAN
9380: 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
9390: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
93a0: 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65  ndle from Create
93b0: 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20  FileMapping */. 
93c0: 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20     void *pMap;. 
93d0: 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44   } *aRegion;.  D
93e0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
93f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9400: 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
9410: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
9420: 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74   error */..  int
9430: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
9440: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9450: 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65  r of winShm obje
9460: 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
9470: 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
9480: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
9490: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53       /* All winS
94a0: 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
94b0: 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
94c0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
94d0: 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  xt;         /* N
94e0: 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61  ext in list of a
94f0: 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
9500: 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20  jects */.#ifdef 
9510: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
9520: 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
9530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
9540: 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53  t available winS
9550: 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
9560: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
9570: 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f  A global array o
9580: 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
9590: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20   objects..**.** 
95a0: 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  The winShmMutexH
95b0: 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
95c0: 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ue while reading
95d0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73   or writing this
95e0: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
95f0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e   winShmNode *win
9600: 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b  ShmNodeList = 0;
9610: 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
9620: 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
9630: 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
9640: 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
9650: 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
9660: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
9670: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
9680: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
9690: 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
96a0: 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
96b0: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
96c0: 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
96d0: 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
96e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68  :.**.**    winSh
96f0: 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20  m.pShmNode.**   
9700: 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a   winShm.id.**.**
9710: 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
9720: 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
9730: 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53  .  The winShm.pS
9740: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75  hmNode->mutex mu
9750: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
9760: 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
9770: 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
9780: 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  lds..*/.struct w
9790: 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d  inShm {.  winShm
97a0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
97b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
97c0: 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  rlying winShmNod
97d0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69  e object */.  wi
97e0: 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  nShm *pNext;    
97f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
9800: 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65   winShm with the
9810: 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65   same winShmNode
9820: 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
9830: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
9840: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
9850: 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  ing the winShmNo
9860: 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31  de mutex */.  u1
9870: 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
9880: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
9890: 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
98a0: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
98b0: 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
98c0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
98d0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
98e0: 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
98f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
9900: 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
9910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
9920: 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
9930: 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53  on with its winS
9940: 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
9950: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
9960: 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
9970: 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
9980: 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20   WIN_SHM_BASE   
9990: 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
99a0: 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
99b0: 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
99c0: 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  yte */.#define W
99d0: 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57  IN_SHM_DMS    (W
99e0: 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IN_SHM_BASE+SQLI
99f0: 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
9a00: 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
9a10: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
9a20: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
9a30: 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20  for all n bytes 
9a40: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73  beginning at ofs
9a50: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53  t..*/.#define _S
9a60: 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66  HM_UNLCK  1.#def
9a70: 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20  ine _SHM_RDLCK  
9a80: 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57  2.#define _SHM_W
9a90: 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
9aa0: 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
9ab0: 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
9ac0: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
9ad0: 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
9ae0: 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
9af0: 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
9b00: 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
9b10: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48  ,         /* _SH
9b20: 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44  M_UNLCK, _SHM_RD
9b30: 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c  LCK, or _SHM_WRL
9b40: 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
9b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
9b60: 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
9b70: 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
9b80: 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
9b90: 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
9ba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9bb0: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
9bc0: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
9bd0: 7b 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  {.  OVERLAPPED o
9be0: 76 6c 70 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  vlp;.  DWORD dwF
9bf0: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lags;.  int rc =
9c00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
9c10: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
9c20: 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c  m Lock/UnlockFil
9c30: 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  eEx() */..  /* A
9c40: 63 63 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e  ccess to the win
9c50: 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
9c60: 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
9c70: 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
9c80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9c90: 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65  mutex_held(pFile
9ca0: 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c  ->mutex) || pFil
9cb0: 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  e->nRef==0 );.. 
9cc0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
9cd0: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
9ce0: 65 74 65 72 73 20 2a 2f 0a 20 20 64 77 46 6c 61  eters */.  dwFla
9cf0: 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  gs = LOCKFILE_FA
9d00: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a  IL_IMMEDIATELY;.
9d10: 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d    if( lockType =
9d20: 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64  = _SHM_WRLCK ) d
9d30: 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49  wFlags |= LOCKFI
9d40: 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
9d50: 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  K;..  memset(&ov
9d60: 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  lp, 0, sizeof(OV
9d70: 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76  ERLAPPED));.  ov
9d80: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 73 74  lp.Offset = ofst
9d90: 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f  ;..  /* Release/
9da0: 41 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74  Acquire the syst
9db0: 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f  em-level lock */
9dc0: 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  .  if( lockType=
9dd0: 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20  =_SHM_UNLCK ){. 
9de0: 20 20 20 72 63 20 3d 20 55 6e 6c 6f 63 6b 46 69     rc = UnlockFi
9df0: 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c  leEx(pFile->hFil
9e00: 65 2e 68 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  e.h, 0, nByte, 0
9e10: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
9e20: 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b  e{.    rc = Lock
9e30: 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 46  FileEx(pFile->hF
9e40: 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20  ile.h, dwFlags, 
9e50: 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76  0, nByte, 0, &ov
9e60: 6c 70 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66  lp);.  }.  .  if
9e70: 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20  ( rc!= 0 ){.    
9e80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9e90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
9ea0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
9eb0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
9ec0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9ed0: 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _BUSY;.  }..  OS
9ee0: 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
9ef0: 20 25 64 20 25 73 20 25 73 20 30 78 25 30 38 6c   %d %s %s 0x%08l
9f00: 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  x\n", .         
9f10: 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
9f20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 3d  ,.           rc=
9f30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
9f40: 22 20 3a 20 22 66 61 69 6c 65 64 22 2c 0a 20 20  " : "failed",.  
9f50: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 54 79 70           lockTyp
9f60: 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20  e==_SHM_UNLCK ? 
9f70: 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a  "UnlockFileEx" :
9f80: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20   "LockFileEx",. 
9f90: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
9fa0: 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20  >lastErrno));.. 
9fb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9fc0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
9fd0: 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68  nces to VFS meth
9fe0: 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ods */.static in
9ff0: 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65  t winOpen(sqlite
a000: 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61  3_vfs*,const cha
a010: 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  r*,sqlite3_file*
a020: 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74  ,int,int*);.stat
a030: 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
a040: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63  (sqlite3_vfs *,c
a050: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
a060: 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
a070: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  e winShmNodeList
a080: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
a090: 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d  ries with winShm
a0a0: 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
a0b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
a0c0: 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
a0d0: 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
a0e0: 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
a0f0: 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
a100: 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
a110: 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
a120: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
a130: 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f  hmPurge(sqlite3_
a140: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64  vfs *pVfs, int d
a150: 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69  eleteFlag){.  wi
a160: 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20  nShmNode **pp;. 
a170: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a   winShmNode *p;.
a180: 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73    BOOL bRc;.  as
a190: 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
a1a0: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 70 70 20  xHeld() );.  pp 
a1b0: 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  = &winShmNodeLis
a1c0: 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d  t;.  while( (p =
a1d0: 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20   *pp)!=0 ){.    
a1e0: 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29  if( p->nRef==0 )
a1f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
a200: 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65       if( p->mute
a210: 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x ) sqlite3_mute
a220: 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
a230: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a240: 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
a250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 62 52 63  ++){.        bRc
a260: 20 3d 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   = UnmapViewOfFi
a270: 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
a280: 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
a290: 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
a2a0: 52 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70  RGE pid-%d unmap
a2b0: 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22   region=%d %s\n"
a2c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a2d0: 20 20 20 28 69 6e 74 29 47 65 74 43 75 72 72 65     (int)GetCurre
a2e0: 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
a2f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a300: 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20     bRc ? "ok" : 
a310: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
a320: 20 20 20 20 62 52 63 20 3d 20 43 6c 6f 73 65 48      bRc = CloseH
a330: 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
a340: 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
a350: 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
a360: 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c  -PURGE pid-%d cl
a370: 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73  ose region=%d %s
a380: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
a390: 20 20 20 20 20 20 28 69 6e 74 29 47 65 74 43 75        (int)GetCu
a3a0: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
a3b0: 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , i,.           
a3c0: 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22        bRc ? "ok"
a3d0: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
a3e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a3f0: 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49   p->hFile.h != I
a400: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
a410: 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53  LUE ){.        S
a420: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
a430: 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
a440: 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74   winClose((sqlit
a450: 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46  e3_file *)&p->hF
a460: 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69  ile);.        Si
a470: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
a480: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
a490: 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
a4a0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
a4b0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
a4c0: 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
a4d0: 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
a4e0: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
a4f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  0);.        Simu
a500: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
a510: 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
a520: 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65      *pp = p->pNe
a530: 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
a540: 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f  3_free(p->aRegio
a550: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
a560: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d  3_free(p);.    }
a570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d  else{.      pp =
a580: 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   &p->pNext;.    
a590: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  }.  }.}../*.** O
a5a0: 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d  pen the shared-m
a5b0: 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
a5c0: 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62  iated with datab
a5d0: 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a  ase file pDbFd..
a5e0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
a5f0: 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
a600: 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
a610: 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
a620: 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
a630: 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
a640: 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
a650: 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
a660: 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
a670: 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
a680: 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
a690: 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
a6a0: 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
a6b0: 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73  er cleared..*/.s
a6c0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
a6d0: 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69  nSharedMemory(wi
a6e0: 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  nFile *pDbFd){. 
a6f0: 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a   struct winShm *
a700: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a710: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
a720: 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
a730: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  ed */.  struct w
a740: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
a750: 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ode = 0;   /* Th
a760: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
a770: 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
a780: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
a7b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
a7c0: 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20  ShmNode *pNew;  
a7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
a7e0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53  y allocated winS
a7f0: 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  hmNode */.  int 
a800: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a820: 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20  * Size of zName 
a830: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61  in bytes */..  a
a840: 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
a850: 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  hm==0 );    /* N
a860: 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  ot previously op
a870: 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ened */..  /* Al
a880: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
a890: 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33   the new sqlite3
a8a0: 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c  _shm object.  Al
a8b0: 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79  so speculatively
a8c0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73  .  ** allocate s
a8d0: 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77  pace for a new w
a8e0: 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69  inShmNode and fi
a8f0: 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70  lename..  */.  p
a900: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
a910: 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  c( sizeof(*p) );
a920: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
a930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
a940: 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
a950: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
a960: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
a970: 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
a980: 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
a990: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
a9a0: 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
a9b0: 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 35 20  e) + nName + 15 
a9c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
a9d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a9e0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
a9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
aa00: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
aa10: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
aa20: 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pNew));.  pNew->
aa30: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
aa40: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73  r*)&pNew[1];.  s
aa50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
aa60: 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e  nName+15, pNew->
aa70: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  zFilename, "%s-s
aa80: 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
aa90: 68 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74  h);..  /* Look t
aaa0: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
aab0: 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69  s an existing wi
aac0: 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61  nShmNode that ca
aad0: 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20  n be used..  ** 
aae0: 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77  If no matching w
aaf0: 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e  inShmNode curren
ab00: 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61  tly exists, crea
ab10: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
ab20: 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
ab30: 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
ab40: 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d  ShmNode = winShm
ab50: 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f  NodeList; pShmNo
ab60: 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68  de; pShmNode=pSh
ab70: 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  mNode->pNext){. 
ab80: 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74     /* TBD need t
ab90: 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62  o come up with b
aba0: 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65  etter match here
abb0: 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a  .  Perhaps.    *
abc0: 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f  * use FILE_ID_BO
abd0: 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75  TH_DIR_INFO Stru
abe0: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
abf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
ac00: 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ICmp(pShmNode->z
ac10: 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e  Filename, pNew->
ac20: 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20  zFilename)==0 ) 
ac30: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
ac40: 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20   pShmNode ){.   
ac50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
ac60: 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ew);.  }else{.  
ac70: 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65    pShmNode = pNe
ac80: 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  w;.    pNew = 0;
ac90: 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29  .    ((winFile*)
aca0: 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  (&pShmNode->hFil
acb0: 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  e))->h = INVALID
acc0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20  _HANDLE_VALUE;. 
acd0: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65     pShmNode->pNe
ace0: 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  xt = winShmNodeL
acf0: 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e  ist;.    winShmN
ad00: 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f  odeList = pShmNo
ad10: 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64  de;..    pShmNod
ad20: 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
ad30: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
ad40: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
ad50: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
ad60: 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
ad70: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
ad80: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
ad90: 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
ada0: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
adb0: 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
adc0: 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
add0: 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
ade0: 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
adf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ae00: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
ae10: 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
ae20: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
ae30: 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
ae40: 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
ae50: 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
ae60: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
ae70: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
ae80: 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
ae90: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
aea0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
aeb0: 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20  , /* Mode flags 
aec0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
aed0: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
aee0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
aef0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
af00: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
af10: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
af20: 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
af30: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
af40: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
af50: 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
af60: 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
af70: 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
af80: 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
af90: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
afa0: 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a  o length. .    *
afb0: 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
afc0: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
afd0: 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
afe0: 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
aff0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b000: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
b010: 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
b020: 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
b030: 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
b040: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b050: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
b060: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
b070: 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20  _SHMOPEN;.      
b080: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
b090: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b0a0: 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79 73  .      winShmSys
b0b0: 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
b0c0: 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  , _SHM_UNLCK, WI
b0d0: 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
b0e0: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
b0f0: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
b100: 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
b110: 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
b120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b130: 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
b140: 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  en_err;.  }..  /
b150: 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
b160: 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
b170: 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 4e  d of the winShmN
b180: 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
b190: 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
b1a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
b1b0: 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
b1c0: 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
b1d0: 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
b1e0: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
b1f0: 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
b200: 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76   p;.  winShmLeav
b210: 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
b220: 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
b230: 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
b240: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b250: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
b260: 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
b270: 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45  r of the winShmE
b280: 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
b290: 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
b2a0: 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
b2b0: 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53  new (struct winS
b2c0: 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
b2d0: 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
b2e0: 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
b2f0: 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
b300: 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
b310: 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
b320: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
b330: 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
b340: 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
b350: 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
b360: 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
b370: 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
b380: 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a  ode->mutex .  **
b390: 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73   mutex..  */.  s
b3a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b3b0: 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
b3c0: 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  ex);.  p->pNext 
b3d0: 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  = pShmNode->pFir
b3e0: 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  st;.  pShmNode->
b3f0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71  pFirst = p;.  sq
b400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
b410: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
b420: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
b430: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
b440: 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65  mp here on any e
b450: 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e  rror */.shm_open
b460: 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79  _err:.  winShmSy
b470: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
b480: 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
b490: 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
b4a0: 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
b4b0: 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
b4c0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
b4d0: 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
b4e0: 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
b4f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
b500: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
b510: 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
b520: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
b530: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b540: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
b550: 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
b560: 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
b570: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
b580: 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
b590: 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
b5a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b5b0: 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20   winShmUnmap(.  
b5c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
b5d0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
b5e0: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
b5f0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
b600: 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b620: 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f  Delete after clo
b630: 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a  sing if true */.
b640: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
b650: 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  bFd;       /* Da
b660: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73  tabase holding s
b670: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
b680: 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20    winShm *p;    
b690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
b6a0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
b6b0: 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53  closed */.  winS
b6c0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
b6d0: 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79  ; /* The underly
b6e0: 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
b6f0: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53  y file */.  winS
b700: 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  hm **pp;        
b710: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
b720: 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
b730: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  nnections */..  
b740: 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
b750: 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
b760: 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70  d->pShm;.  if( p
b770: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
b780: 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f  ITE_OK;.  pShmNo
b790: 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
b7a0: 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  ;..  /* Remove c
b7b0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d  onnection p from
b7c0: 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e   the set of conn
b7d0: 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  ections associat
b7e0: 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68  ed.  ** with pSh
b7f0: 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74  mNode */.  sqlit
b800: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
b810: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
b820: 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e  .  for(pp=&pShmN
b830: 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70  ode->pFirst; (*p
b840: 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70  p)!=p; pp = &(*p
b850: 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a  p)->pNext){}.  *
b860: 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a  pp = p->pNext;..
b870: 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f    /* Free the co
b880: 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20  nnection p */.  
b890: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
b8a0: 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
b8b0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   0;.  sqlite3_mu
b8c0: 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
b8d0: 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  de->mutex);..  /
b8e0: 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  * If pShmNode->n
b8f0: 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20  Ref has reached 
b900: 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  0, then close th
b910: 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a  e underlying.  *
b920: 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
b930: 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77  file, too */.  w
b940: 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
b950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
b960: 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
b970: 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
b980: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
b990: 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
b9a0: 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28      winShmPurge(
b9b0: 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c  pDbFd->pVfs, del
b9c0: 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20  eteFlag);.  }.  
b9d0: 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
b9e0: 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
b9f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ba00: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63  * Change the loc
ba10: 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68  k state for a sh
ba20: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
ba30: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ba40: 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20  nt winShmLock(. 
ba50: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
ba60: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
ba70: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
ba80: 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
ba90: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
baa0: 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
bab0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bac0: 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
bad0: 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
bae0: 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
baf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bb00: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
bb10: 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
bb20: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
bb30: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
bb40: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
bb50: 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
bb60: 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
bb70: 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c  *pDbFd = (winFil
bb80: 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a  e*)fd;        /*
bb90: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
bba0: 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
bbb0: 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
bbc0: 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20   = pDbFd->pShm; 
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bbe0: 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
bbf0: 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
bc00: 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20  /.  winShm *pX; 
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
bc30: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
bc40: 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
bc50: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
bc60: 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
bc70: 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
bc80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
bca0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
bcb0: 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20  u16 mask;       
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
bce0: 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f   locks to take o
bcf0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20  r release */..  
bd00: 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
bd10: 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
bd20: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
bd30: 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
bd40: 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
bd50: 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
bd60: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
bd70: 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
bd80: 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
bd90: 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
bda0: 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
bdb0: 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
bdc0: 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
bdd0: 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
bde0: 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
bdf0: 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
be00: 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
be10: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
be20: 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
be30: 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
be40: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
be50: 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
be60: 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29  ..  mask = (u16)
be70: 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20  ((1U<<(ofst+n)) 
be80: 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20  - (1U<<ofst));. 
be90: 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
bea0: 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
beb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
bec0: 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
bed0: 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
bee0: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
bef0: 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
bf00: 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
bf10: 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
bf20: 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
bf30: 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
bf40: 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
bf50: 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
bf60: 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
bf70: 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
bf80: 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
bf90: 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
bfa0: 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
bfb0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
bfc0: 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
bfd0: 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
bfe0: 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
bff0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
c000: 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
c010: 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
c020: 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
c030: 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
c040: 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
c050: 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
c060: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
c070: 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
c080: 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
c090: 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_UNLCK, ofst+WI
c0a0: 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
c0b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c0c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c0d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
c0e0: 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
c0f0: 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
c100: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c110: 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
c120: 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
c130: 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
c140: 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
c150: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
c160: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
c170: 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
c180: 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
c190: 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
c1a0: 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
c1b0: 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
c1c0: 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
c1d0: 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
c1e0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
c1f0: 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
c200: 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
c210: 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
c220: 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
c230: 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
c240: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
c250: 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
c260: 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
c270: 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
c280: 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
c290: 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
c2a0: 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
c2b0: 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
c2c0: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
c2d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c2e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
c2f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c300: 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
c310: 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
c320: 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
c330: 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
c340: 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
c350: 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
c360: 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
c370: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c380: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
c390: 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
c3a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
c3b0: 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
c3c0: 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
c3d0: 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_RDLCK, ofst+
c3e0: 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
c3f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c400: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
c410: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
c420: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
c430: 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65   the local share
c440: 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  d locks */.    i
c450: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c460: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   ){.      p->sha
c470: 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
c480: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
c490: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
c4a0: 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e   no sibling conn
c4b0: 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63  ections hold loc
c4c0: 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f  ks that will blo
c4d0: 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c  ck this.    ** l
c4e0: 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c  ock.  If any do,
c4f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
c500: 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a  USY right away..
c510: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
c520: 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
c530: 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
c540: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
c550: 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
c560: 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58   mask)!=0 || (pX
c570: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
c580: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
c590: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
c5a0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
c5b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
c5c0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20  }.  .    /* Get 
c5d0: 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
c5e0: 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
c5f0: 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
c600: 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
c610: 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
c620: 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
c630: 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
c640: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
c650: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c660: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
c670: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
c680: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
c690: 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  RLCK, ofst+WIN_S
c6a0: 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
c6b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c6c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c6d0: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
c6e0: 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
c6f0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
c700: 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
c710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c720: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
c730: 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
c740: 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
c750: 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
c760: 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
c770: 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 20  d got %03x,%03x 
c780: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
c790: 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29 47 65    p->id, (int)Ge
c7a0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
c7b0: 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
c7c0: 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c  sk, p->exclMask,
c7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3f  .           rc ?
c7e0: 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
c7f0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
c800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
c810: 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
c820: 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
c830: 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
c840: 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
c850: 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
c860: 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
c870: 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
c880: 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
c890: 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
c8a0: 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
c8b0: 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
c8c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
c8d0: 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  inShmBarrier(.  
c8e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
c8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
c900: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
c910: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
c920: 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
c930: 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
c940: 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  /* MemoryBarrier
c950: 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20  (); // does not 
c960: 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b  work -- do not k
c970: 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20  now why not */. 
c980: 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
c990: 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  x();.  winShmLea
c9a0: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
c9b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c9c0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
c9d0: 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
c9e0: 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
c9f0: 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
ca00: 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
ca10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
ca20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
ca30: 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
ca40: 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
ca50: 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
ca60: 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
ca70: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
ca80: 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
ca90: 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
caa0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
cab0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
cac0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
cad0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
cae0: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
caf0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
cb00: 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65  , if the isWrite
cb10: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
cb20: 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
cb30: 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
cb40: 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
cb50: 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
cb60: 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
cb70: 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
cb80: 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
cb90: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
cba0: 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
cbb0: 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
cbc0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
cbd0: 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65  . If .** isWrite
cbe0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
cbf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
cc00: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
cc10: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
cc20: 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
cc30: 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
cc40: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
cc50: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
cc60: 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
cc70: 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
cc80: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
cc90: 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
cca0: 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
ccb0: 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
ccc0: 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
ccd0: 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
cce0: 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
ccf0: 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
cd00: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
cd10: 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
cd20: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
cd30: 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
cd40: 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
cd50: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
cd60: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
cd70: 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
cd80: 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
cd90: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
cda0: 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
cdb0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
cdc0: 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
cdd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
cde0: 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
cdf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
ce00: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
ce10: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ce20: 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
ce30: 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20  nt isWrite,     
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce50: 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
ce60: 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
ce70: 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
ce80: 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
ce90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
cea0: 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
ceb0: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
cec0: 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
ced0: 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
cee0: 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
cef0: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
cf00: 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
cf10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
cf20: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
cf30: 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  c = winOpenShare
cf40: 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
cf50: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cf60: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cf70: 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64  c;.    p = pDbFd
cf80: 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53  ->pShm;.  }.  pS
cf90: 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
cfa0: 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Node;..  sqlite3
cfb0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
cfc0: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
cfd0: 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
cfe0: 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
cff0: 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
d000: 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
d010: 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
d020: 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
d030: 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  on ){.    struct
d040: 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65   ShmRegion *apNe
d050: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
d060: 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72  New aRegion[] ar
d070: 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
d080: 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
d090: 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
d0a0: 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
d0b0: 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
d0c0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
d0d0: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
d0e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
d0f0: 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64   size of wal-ind
d100: 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ex file */..    
d110: 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
d120: 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
d130: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
d140: 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
d150: 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
d160: 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
d170: 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
d180: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
d190: 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
d1a0: 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
d1b0: 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
d1c0: 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
d1d0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
d1e0: 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
d1f0: 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
d200: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77     */.    rc = w
d210: 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
d220: 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
d230: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a  Node->hFile, &sz
d240: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d250: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d260: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
d270: 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
d280: 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
d290: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
d2a0: 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
d2b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
d2c0: 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
d2d0: 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
d2e0: 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
d2f0: 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
d300: 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
d310: 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
d320: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
d330: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
d340: 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
d350: 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
d360: 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
d370: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
d380: 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
d390: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
d3a0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
d3b0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
d3c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
d3d0: 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
d3e0: 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
d3f0: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
d400: 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
d410: 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
d420: 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
d430: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d440: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d450: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d460: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
d470: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
d480: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
d490: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
d4a0: 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ap the requested
d4b0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69   memory region i
d4c0: 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
d4d0: 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
d4e0: 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d  . */.    apNew =
d4f0: 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69   (struct ShmRegi
d500: 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  on *)sqlite3_rea
d510: 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
d520: 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c  hmNode->aRegion,
d530: 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a   (iRegion+1)*siz
d540: 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20  eof(apNew[0]).  
d550: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
d560: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
d570: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
d580: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
d590: 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
d5a0: 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
d5b0: 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  ->aRegion = apNe
d5c0: 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70  w;..    while( p
d5d0: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
d5e0: 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
d5f0: 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d610: 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68  * file-mapping h
d620: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76  andle */.      v
d630: 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20  oid *pMap = 0;  
d640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
d650: 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  pped memory regi
d660: 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20  on */.     .    
d670: 20 20 68 4d 61 70 20 3d 20 43 72 65 61 74 65 46    hMap = CreateF
d680: 69 6c 65 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e  ileMapping(pShmN
d690: 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20  ode->hFile.h, . 
d6a0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
d6b0: 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
d6c0: 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
d6d0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 4f 53 54      );.      OST
d6e0: 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70  RACE(("SHM-MAP p
d6f0: 69 64 2d 25 64 20 63 72 65 61 74 65 20 72 65 67  id-%d create reg
d700: 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20  ion=%d nbyte=%d 
d710: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
d720: 20 20 20 20 20 20 28 69 6e 74 29 47 65 74 43 75        (int)GetCu
d730: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
d740: 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
d750: 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ion, nByte,.    
d760: 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20             hMap 
d770: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
d780: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68  "));.      if( h
d790: 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Map ){.        i
d7a0: 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68  nt iOffset = pSh
d7b0: 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73  mNode->nRegion*s
d7c0: 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20  zRegion;.       
d7d0: 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
d7e0: 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
d7f0: 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
d800: 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
d810: 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  ;.        pMap =
d820: 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68   MapViewOfFile(h
d830: 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
d840: 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
d850: 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
d860: 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f   0, iOffset - iO
d870: 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
d880: 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
d890: 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ift.        );. 
d8a0: 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
d8b0: 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20  "SHM-MAP pid-%d 
d8c0: 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66  map region=%d of
d8d0: 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64 20  fset=%d size=%d 
d8e0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
d8f0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 47 65 74          (int)Get
d900: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
d910: 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
d920: 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 20  egion, iOffset, 
d930: 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20  szRegion,.      
d940: 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 70 20             pMap 
d950: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
d960: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
d970: 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a     if( !pMap ){.
d980: 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
d990: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
d9a0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
d9b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d9c0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
d9d0: 20 69 66 28 20 68 4d 61 70 20 29 20 43 6c 6f 73   if( hMap ) Clos
d9e0: 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
d9f0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
da00: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
da10: 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
da20: 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
da30: 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
da40: 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
da50: 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
da60: 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
da70: 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
da80: 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
da90: 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
daa0: 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
dab0: 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
dac0: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
dad0: 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
dae0: 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
daf0: 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
db00: 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
db10: 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
db20: 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
db30: 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
db40: 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
db50: 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
db60: 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
db70: 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
db80: 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
db90: 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
dba0: 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
dbb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
dbc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
dbd0: 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
dbe0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
dbf0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
dc00: 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
dc10: 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
dc20: 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
dc30: 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
dc40: 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
dc50: 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
dc60: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
dc70: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
dc80: 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
dc90: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
dca0: 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
dcb0: 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
dcc0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
dcd0: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
dce0: 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
dcf0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
dd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd10: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
dd20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
dd60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
dd70: 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
dd80: 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
dd90: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
dda0: 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
ddb0: 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
ddc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
ddd0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
dde0: 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
ddf0: 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
de20: 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
de50: 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
de80: 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
deb0: 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
dee0: 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
df10: 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
df40: 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
df70: 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df90: 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
dfa0: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
dfb0: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
dfc0: 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
dfd0: 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
dfe0: 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
dff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
e000: 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
e010: 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
e040: 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
e050: 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
e060: 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
e070: 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
e080: 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
e0b0: 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
e0e0: 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
e0f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
e100: 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
e110: 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
e120: 6d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  map             
e130: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
e140: 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  nmap */.};../***
e150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
e1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1b0: 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
e1c0: 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
e1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e1e0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
e1f0: 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
e200: 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
e210: 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
e220: 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
e230: 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
e240: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .*/../*.** Conve
e250: 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e  rt a UTF-8 filen
e260: 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ame into whateve
e270: 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72  r form the under
e280: 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  lying.** operati
e290: 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20  ng system wants 
e2a0: 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53  filenames in.  S
e2b0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
e2c0: 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62   result.** is ob
e2d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
e2e0: 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
e2f0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
e300: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
e310: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e320: 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65  *convertUtf8File
e330: 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
e340: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
e350: 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
e360: 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  = 0;.  if( isNT(
e370: 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
e380: 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ted = utf8ToUnic
e390: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
e3a0: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
e3b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
e3c0: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
e3d0: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
e3e0: 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51  uted. .*/.#if SQ
e3f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
e400: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43  .  }else{.    zC
e410: 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54  onverted = utf8T
e420: 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29  oMbcs(zFilename)
e430: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f  ;.#endif.  }.  /
e440: 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  * caller will ha
e450: 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ndle out of memo
e460: 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a  ry */.  return z
e470: 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a  Converted;.}../*
e480: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
e490: 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
e4a0: 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
e4b0: 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
e4c0: 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74  gh to.** hold at
e4d0: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
e4e0: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  e characters..*/
e4f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54  .static int getT
e500: 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
e510: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
e520: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68   static char zCh
e530: 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
e540: 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
e550: 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
e560: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
e570: 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
e580: 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69  123456789";.  si
e590: 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61  ze_t i, j;.  cha
e5a0: 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f  r zTempPath[MAX_
e5b0: 50 41 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 49  PATH+1];..  /* I
e5c0: 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
e5d0: 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
e5e0: 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
e5f0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
e600: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
e610: 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
e620: 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
e630: 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
e640: 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
e650: 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
e660: 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
e670: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
e680: 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
e690: 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
e6a0: 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
e6b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
e6c0: 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
e6d0: 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
e6e0: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
e6f0: 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73  rectory);.  }els
e700: 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a  e if( isNT() ){.
e710: 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69      char *zMulti
e720: 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69 64  ;.    WCHAR zWid
e730: 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b  ePath[MAX_PATH];
e740: 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68  .    GetTempPath
e750: 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  W(MAX_PATH-30, z
e760: 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a  WidePath);.    z
e770: 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54  Multi = unicodeT
e780: 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
e790: 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
e7a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e7b0: 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
e7c0: 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
e7d0: 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29  h, "%s", zMulti)
e7e0: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4d 75  ;.      free(zMu
e7f0: 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lti);.    }else{
e800: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e810: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e820: 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  }./* isNT() is 1
e830: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
e840: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
e850: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
e860: 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
e870: 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
e880: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
e890: 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
e8a0: 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
e8b0: 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
e8c0: 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
e8d0: 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
e8e0: 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
e8f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
e900: 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
e910: 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20    char *zUtf8;. 
e920: 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74     char zMbcsPat
e930: 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20  h[MAX_PATH];.   
e940: 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41   GetTempPathA(MA
e950: 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73  X_PATH-30, zMbcs
e960: 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38  Path);.    zUtf8
e970: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
e980: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d  _mbcs_to_utf8(zM
e990: 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66  bcsPath);.    if
e9a0: 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
e9b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e9c0: 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
e9d0: 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
e9e0: 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 66 72  zUtf8);.      fr
e9f0: 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d  ee(zUtf8);.    }
ea00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
ea10: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
ea20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ea30: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  }..  /* Check th
ea40: 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
ea50: 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
ea60: 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
ea70: 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
ea80: 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
ea90: 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
eaa0: 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
eab0: 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 74    if( (sqlite3St
eac0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
ead0: 29 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ) + sqlite3Strle
eae0: 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  n30(SQLITE_TEMP_
eaf0: 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31  FILE_PREFIX) + 1
eb00: 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20  7) >= nBuf ){.  
eb10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eb20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f  ERROR;.  }..  fo
eb30: 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  r(i=sqlite3Strle
eb40: 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20  n30(zTempPath); 
eb50: 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68  i>0 && zTempPath
eb60: 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d  [i-1]=='\\'; i--
eb70: 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b  ){}.  zTempPath[
eb80: 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74  i] = 0;..  sqlit
eb90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
eba0: 2d 31 37 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  -17, zBuf,.     
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
ebc0: 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  s\\"SQLITE_TEMP_
ebd0: 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65  FILE_PREFIX, zTe
ebe0: 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73  mpPath);.  j = s
ebf0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ec00: 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
ec10: 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
ec20: 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
ec30: 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
ec40: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
ec50: 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
ec60: 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
ec70: 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
ec80: 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
ec90: 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
eca0: 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   0;..  OSTRACE((
ecb0: 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20  "TEMP FILENAME: 
ecc0: 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  %s\n", zBuf));. 
ecd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ece0: 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  K; .}../*.** The
ecf0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
ed00: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
ed10: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
ed20: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
ed30: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
ed40: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
ed50: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
ed60: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
ed70: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
ed80: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c  .static int getL
ed90: 61 73 74 45 72 72 6f 72 4d 73 67 28 69 6e 74 20  astErrorMsg(int 
eda0: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
edb0: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
edc0: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
edd0: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
ede0: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
edf0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
ee00: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
ee10: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
ee20: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
ee30: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
ee40: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
ee50: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
ee60: 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74   error = GetLast
ee70: 45 72 72 6f 72 28 29 3b 0a 20 20 44 57 4f 52 44  Error();.  DWORD
ee80: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
ee90: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
eea0: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
eeb0: 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 57     WCHAR *zTempW
eec0: 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ide = NULL;.    
eed0: 64 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65  dwLen = FormatMe
eee0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
eef0: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
ef00: 55 46 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d  UFFER | FORMAT_M
ef10: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
ef20: 45 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53  EM | FORMAT_MESS
ef30: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
ef40: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
ef60: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  error,.         
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
efd0: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
efe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eff0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
f010: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
f020: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
f030: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
f040: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
f050: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 7a   UTF8 */.      z
f060: 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  Out = unicodeToU
f070: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
f080: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
f090: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
f0a0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
f0b0: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
f0c0: 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54      LocalFree(zT
f0d0: 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a  empWide);.    }.
f0e0: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
f0f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
f100: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
f110: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
f120: 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
f130: 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
f140: 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
f150: 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
f160: 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
f170: 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
f180: 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
f190: 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
f1a0: 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
f1b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
f1c0: 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
f1d0: 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55  char *zTemp = NU
f1e0: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
f1f0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
f200: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
f210: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 20  LOCATE_BUFFER | 
f220: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
f230: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52  ROM_SYSTEM | FOR
f240: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
f250: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a 20          error,. 
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20          (LPSTR) 
f2e0: 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20  &zTemp,.        
f2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f300: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
f330: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
f340: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
f350: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
f360: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
f370: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
f380: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
f390: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
f3a0: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
f3b0: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
f3c0: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
f3d0: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
f3e0: 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29  LocalFree(zTemp)
f3f0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f400: 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77   }.  if( 0 == dw
f410: 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Len ){.    sqlit
f420: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
f430: 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72  , zBuf, "OsError
f440: 20 30 78 25 78 20 28 25 75 29 22 2c 20 65 72 72   0x%x (%u)", err
f450: 6f 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d 65  or, error);.  }e
f460: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
f470: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
f480: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
f490: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
f4a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f4b0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
f4c0: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
f4d0: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
f4e0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 66 72  buffer */.    fr
f4f0: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  ee(zOut);.  }.  
f500: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f510: 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a  ** Open a file..
f520: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
f530: 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  nOpen(.  sqlite3
f540: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
f550: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
f560: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
f570: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
f580: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
f590: 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
f5a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
f5c0: 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
f5d0: 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
f5e0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f600: 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
f610: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
f620: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
f630: 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
f640: 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
f650: 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
f660: 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
f670: 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
f680: 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
f690: 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
f6a0: 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
f6b0: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
f6c0: 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  s = 0;.#if SQLIT
f6d0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
f6e0: 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e   isTemp = 0;.#en
f6f0: 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
f700: 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
f710: 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
f720: 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20  nverted;        
f730: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
f740: 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
f750: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
f760: 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
f770: 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ame; /* Filename
f780: 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
f790: 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61  ng */..  /* If a
f7a0: 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
f7b0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
f7c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
f7d0: 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
f7e0: 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
f7f0: 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
f800: 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
f810: 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
f820: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
f830: 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
f840: 54 48 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 42 75  TH+1];     /* Bu
f850: 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72 65  ffer used to cre
f860: 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d  ate temp filenam
f870: 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d  e */..  int rc =
f880: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
f890: 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
f8a0: 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
f8b0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
f8c0: 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45  DEBUG) || SQLITE
f8d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
f8e0: 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
f8f0: 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
f900: 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
f910: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  en */.#endif..  
f920: 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
f930: 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
f940: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
f950: 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
f960: 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
f970: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
f980: 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
f990: 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
f9a0: 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
f9b0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
f9c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
f9d0: 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
f9e0: 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
f9f0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
fa00: 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  LY);.#endif.  in
fa10: 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
fa20: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
fa30: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
fa40: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
fa50: 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
fa60: 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
fa70: 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
fa80: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
fa90: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
faa0: 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
fab0: 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
fac0: 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
fad0: 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
fae0: 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
faf0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
fb00: 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
fb10: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
fb20: 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
fb30: 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
fb40: 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
fb50: 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
fb60: 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
fb70: 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
fb80: 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
fb90: 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
fba0: 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
fbb0: 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
fbc0: 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
fbd0: 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
fbe0: 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
fbf0: 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
fc00: 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
fc10: 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
fc20: 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
fc30: 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
fc40: 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
fc50: 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
fc60: 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
fc70: 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
fc80: 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
fc90: 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
fca0: 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
fcb0: 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
fcc0: 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
fcd0: 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
fce0: 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
fcf0: 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
fd00: 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
fd10: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
fd20: 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
fd30: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
fd40: 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
fd50: 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
fd60: 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
fd70: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
fd80: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
fd90: 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
fda0: 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
fdb0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
fdc0: 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
fdd0: 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
fde0: 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
fdf0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
fe00: 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
fe10: 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
fe20: 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
fe30: 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
fe40: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
fe50: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
fe60: 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
fe70: 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
fe80: 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
fe90: 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
fea0: 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
feb0: 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
fec0: 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
fed0: 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
fee0: 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
fef0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
ff00: 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
ff10: 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
ff20: 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
ff30: 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
ff40: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
ff50: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
ff60: 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
ff70: 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
ff80: 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
ff90: 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
ffa0: 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
ffb0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
ffc0: 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
ffd0: 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
ffe0: 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
fff0: 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
10000 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
10010 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55  rt( id!=0 );.  U
10020 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10030 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d  pVfs);..  pFile-
10040 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
10050 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a  DLE_VALUE;..  /*
10060 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
10070 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
10080 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
10090 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20  , generate a .  
100a0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
100b0 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20  e name to use . 
100c0 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38   */.  if( !zUtf8
100d0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Name ){.    asse
100e0 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
100f0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  isOpenJournal);.
10100 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
10110 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c  name(MAX_PATH+1,
10120 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
10130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10140 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10150 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10160 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70  zUtf8Name = zTmp
10170 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
10180 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65  Convert the file
10190 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74  name to the syst
101a0 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a  em encoding. */.
101b0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
101c0 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
101d0 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  me(zUtf8Name);. 
101e0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
101f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10200 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10210 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
10220 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
10230 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
10240 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
10250 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
10260 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
10270 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
10280 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
10290 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
102a0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
102b0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
102c0 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
102d0 73 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e  s .  ** created.
102e0 20 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20   SQLite doesn't 
102f0 75 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61  use it to indica
10300 74 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63  te "exclusive ac
10310 63 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69  cess" .  ** as i
10320 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64  t is usually und
10330 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20  erstood..  */.  
10340 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
10350 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ){.    /* Create
10360 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e  s a new file, on
10370 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  ly if it does no
10380 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  t already exist.
10390 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   */.    /* If th
103a0 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69  e file exists, i
103b0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  t fails. */.    
103c0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
103d0 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e  ition = CREATE_N
103e0 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EW;.  }else if( 
103f0 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20  isCreate ){.    
10400 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67  /* Open existing
10410 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65   file, or create
10420 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65   if it doesn't e
10430 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72  xist */.    dwCr
10440 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
10450 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b  n = OPEN_ALWAYS;
10460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10470 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f   Opens a file, o
10480 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73  nly if it exists
10490 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
104a0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
104b0 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a   OPEN_EXISTING;.
104c0 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f    }..  dwShareMo
104d0 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f  de = FILE_SHARE_
104e0 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52  READ | FILE_SHAR
104f0 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20  E_WRITE;..  if( 
10500 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
10510 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
10520 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
10530 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
10540 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
10550 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31  ;.    isTemp = 1
10560 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c  ;.#else.    dwFl
10570 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
10580 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
10590 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20  E_TEMPORARY.    
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
105c0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
105d0 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EN.             
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45    | FILE_FLAG_DE
10600 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23  LETE_ON_CLOSE;.#
10610 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
10620 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
10630 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
10640 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b  TTRIBUTE_NORMAL;
10650 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74  .  }.  /* Report
10660 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  s from the inter
10670 6e 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72  net are that per
10680 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61  formance is alwa
10690 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69  ys.  ** better i
106a0 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  f FILE_FLAG_RAND
106b0 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65  OM_ACCESS is use
106c0 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39  d.  Ticket #2699
106d0 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
106e0 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61  OS_WINCE.  dwFla
106f0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
10700 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e  |= FILE_FLAG_RAN
10710 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64  DOM_ACCESS;.#end
10720 69 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  if..  if( isNT()
10730 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61   ){.    h = Crea
10740 74 65 46 69 6c 65 57 28 28 57 43 48 41 52 2a 29  teFileW((WCHAR*)
10750 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
10760 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
10770 73 73 2c 0a 20 20 20 20 20 20 20 64 77 53 68 61  ss,.       dwSha
10780 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e  reMode,.       N
10790 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77 43 72  ULL,.       dwCr
107a0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
107b0 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 6c 61 67  n,.       dwFlag
107c0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
107d0 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
107e0 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  );./* isNT() is 
107f0 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
10800 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
10810 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
10820 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
10830 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
10840 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
10850 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
10860 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
10870 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
10880 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
10890 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
108a0 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
108b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
108c0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
108d0 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
108e0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
108f0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44  rted,.       dwD
10900 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
10910 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
10920 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20  ,.       NULL,. 
10930 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
10940 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
10950 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
10960 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
10970 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 23 65 6e   NULL.    );.#en
10980 64 69 66 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  dif.  }..  OSTRA
10990 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 20  CE(("OPEN %d %s 
109a0 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20  0x%lx %s\n", .  
109b0 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d           h, zNam
109c0 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65  e, dwDesiredAcce
109d0 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ss, .           
109e0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
109f0 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69 6c 65  E_VALUE ? "faile
10a00 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
10a10 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
10a20 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
10a30 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
10a40 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
10a50 6f 72 28 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  or();.    free(z
10a60 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
10a70 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
10a80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10a90 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
10aa0 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
10ab0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
10ac0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10ad0 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50  NLY)&~(SQLITE_OP
10ae0 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
10af0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
10b00 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  ), pOutFlags);. 
10b10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
10b30 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
10b40 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
10b50 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
10b60 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
10b70 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
10b80 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
10b90 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
10ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
10bb0 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
10bc0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
10bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
10be0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
10bf0 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20  zeof(*pFile));. 
10c00 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
10c10 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
10c20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
10c30 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10c40 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
10c50 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70   pFile->pVfs = p
10c60 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53  Vfs;.  pFile->pS
10c70 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  hm = 0;.  pFile-
10c80 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
10c90 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
10ca0 69 7a 65 20 3d 20 67 65 74 53 65 63 74 6f 72 53  ize = getSectorS
10cb0 69 7a 65 28 70 56 66 73 2c 20 7a 55 74 66 38 4e  ize(pVfs, zUtf8N
10cc0 61 6d 65 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ame);..#if SQLIT
10cd0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28  E_OS_WINCE.  if(
10ce0 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
10cf0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
10d00 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
10d10 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74    && !winceCreat
10d20 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
10d30 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f  le).  ){.    Clo
10d40 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
10d50 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
10d60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10d70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
10d80 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  PT;.  }.  if( is
10d90 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
10da0 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
10db0 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
10dc0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
10dd0 20 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e   {.    free(zCon
10de0 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
10df0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
10e00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10e10 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
10e20 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
10e30 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
10e40 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
10e50 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
10e60 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
10e70 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
10e80 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
10e90 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
10ea0 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
10eb0 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
10ec0 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
10ed0 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
10ee0 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
10ef0 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
10f00 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
10f10 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
10f20 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
10f30 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
10f40 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
10f50 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
10f60 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
10f70 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
10f80 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
10f90 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
10fa0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
10fb0 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
10fc0 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
10fd0 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
10fe0 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
10ff0 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
11000 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
11010 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
11020 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64   an error..*/.#d
11030 65 66 69 6e 65 20 4d 58 5f 44 45 4c 45 54 49 4f  efine MX_DELETIO
11040 4e 5f 41 54 54 45 4d 50 54 53 20 35 0a 73 74 61  N_ATTEMPTS 5.sta
11050 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
11060 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
11070 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
11080 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
11090 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
110a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
110b0 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
110c0 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
110d0 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
110e0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
110f0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
11100 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
11110 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 44 57  nt cnt = 0;.  DW
11120 4f 52 44 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  ORD rc;.  DWORD 
11130 65 72 72 6f 72 20 3d 20 30 3b 0a 20 20 76 6f 69  error = 0;.  voi
11140 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
11150 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
11160 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
11170 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
11180 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
11190 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
111a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
111b0 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74  ETE);.  zConvert
111c0 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
111d0 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
111e0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
111f0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
11200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
11210 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
11220 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 7b  sNT() ){.    do{
11230 0a 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c  .      DeleteFil
11240 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  eW(zConverted);.
11250 20 20 20 20 7d 77 68 69 6c 65 28 20 20 20 28 20      }while(   ( 
11260 20 20 28 28 72 63 20 3d 20 47 65 74 46 69 6c 65    ((rc = GetFile
11270 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
11280 76 65 72 74 65 64 29 29 20 21 3d 20 49 4e 56 41  verted)) != INVA
11290 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
112a0 54 45 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  TES).           
112b0 20 20 20 20 7c 7c 20 28 28 65 72 72 6f 72 20 3d      || ((error =
112c0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
112d0 20 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53   == ERROR_ACCESS
112e0 5f 44 45 4e 49 45 44 29 29 0a 20 20 20 20 20 20  _DENIED)).      
112f0 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 20 3c       && (++cnt <
11300 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
11310 45 4d 50 54 53 29 0a 20 20 20 20 20 20 20 20 20  EMPTS).         
11320 20 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29    && (Sleep(100)
11330 2c 20 31 29 20 29 3b 0a 2f 2a 20 69 73 4e 54 28  , 1) );./* isNT(
11340 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
11350 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
11360 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
11370 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
11380 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
11390 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
113a0 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
113b0 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
113c0 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
113d0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
113e0 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
113f0 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
11400 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
11410 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
11420 73 65 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  se{.    do{.    
11430 20 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43    DeleteFileA(zC
11440 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d  onverted);.    }
11450 77 68 69 6c 65 28 20 20 20 28 20 20 20 28 28 72  while(   (   ((r
11460 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69  c = GetFileAttri
11470 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65  butesA(zConverte
11480 64 29 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46  d)) != INVALID_F
11490 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29 0a  ILE_ATTRIBUTES).
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
114b0 7c 20 28 28 65 72 72 6f 72 20 3d 20 47 65 74 4c  | ((error = GetL
114c0 61 73 74 45 72 72 6f 72 28 29 29 20 3d 3d 20 45  astError()) == E
114d0 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
114e0 45 44 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ED)).           
114f0 26 26 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44  && (++cnt < MX_D
11500 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
11510 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
11520 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  (Sleep(100), 1) 
11530 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
11540 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
11550 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
11560 4c 45 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e  LETE \"%s\" %s\n
11570 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  ", zFilename,.  
11580 20 20 20 20 20 28 20 28 72 63 3d 3d 49 4e 56 41       ( (rc==INVA
11590 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
115a0 54 45 53 29 20 26 26 20 28 65 72 72 6f 72 3d 3d  TES) && (error==
115b0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
115c0 4f 55 4e 44 29 29 20 3f 0a 20 20 20 20 20 20 20  OUND)) ?.       
115d0 20 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64    "ok" : "failed
115e0 22 20 29 29 3b 0a 20 0a 20 20 72 65 74 75 72 6e  " ));. .  return
115f0 20 28 20 20 20 28 72 63 20 3d 3d 20 49 4e 56 41   (   (rc == INVA
11600 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
11610 54 45 53 29 20 0a 20 20 20 20 20 20 20 20 20 20  TES) .          
11620 26 26 20 28 65 72 72 6f 72 20 3d 3d 20 45 52 52  && (error == ERR
11630 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
11640 44 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  D)) ? SQLITE_OK 
11650 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  : SQLITE_IOERR_D
11660 45 4c 45 54 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ELETE;.}../*.** 
11670 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 61  Check the exista
11680 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
11690 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
116a0 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
116b0 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
116c0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
116d0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
116e0 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
116f0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
11700 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11710 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
11720 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11740 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
11750 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
11760 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
11770 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
11780 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
11790 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
117a0 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
117b0 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
117c0 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
117d0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
117e0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
117f0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
11800 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
11810 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65  ; );.  zConverte
11820 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
11830 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
11840 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
11850 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
11860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
11870 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
11880 4e 54 28 29 20 29 7b 0a 20 20 20 20 57 49 4e 33  NT() ){.    WIN3
11890 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
118a0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
118b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
118c0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
118d0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
118e0 20 20 20 69 66 28 20 47 65 74 46 69 6c 65 41 74     if( GetFileAt
118f0 74 72 69 62 75 74 65 73 45 78 57 28 28 57 43 48  tributesExW((WCH
11900 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  AR*)zConverted,.
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
11930 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
11940 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rd, .           
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b    &sAttrData) ){
11970 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
11980 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
11990 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
119a0 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
119b0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
119c0 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
119d0 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
119e0 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
119f0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
11a00 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
11a10 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
11a20 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
11a30 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
11a40 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
11a50 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
11a60 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
11a70 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
11a80 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
11a90 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
11aa0 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
11ab0 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
11ac0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
11ad0 20 20 20 20 20 20 69 66 28 20 47 65 74 4c 61 73        if( GetLas
11ae0 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f  tError()!=ERROR_
11af0 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  FILE_NOT_FOUND )
11b00 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  {.        free(z
11b10 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
11b20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11b30 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a  E_IOERR_ACCESS;.
11b40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11b50 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
11b60 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
11b70 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
11b80 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20   }./* isNT() is 
11b90 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
11ba0 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
11bb0 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
11bc0 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
11bd0 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
11be0 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
11bf0 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
11c00 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
11c10 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
11c20 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
11c30 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
11c40 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
11c50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
11c60 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
11c70 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c     attr = GetFil
11c80 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
11c90 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
11ca0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72  .#endif.  }.  fr
11cb0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
11cc0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
11cd0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
11ce0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
11cf0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
11d00 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
11d10 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
11d20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
11d30 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
11d40 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
11d50 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
11d60 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
11d70 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f   = (attr & FILE_
11d80 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
11d90 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
11da0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
11db0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
11dc0 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
11dd0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
11de0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
11df0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11e00 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
11e10 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
11e20 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
11e30 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72  ll pathname.  Wr
11e40 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20  ite the full.** 
11e50 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f  pathname into zO
11e60 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69  ut[].  zOut[] wi
11e70 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70  ll be at least p
11e80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
11e90 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
11ea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11eb0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
11ec0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
11ed0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
11ee0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
11ef0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
11f00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
11f10 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tive,        /* 
11f20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
11f30 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
11f40 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20    int nFull,    
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
11f70 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
11f80 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75  s */.  char *zFu
11f90 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
11fa0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
11fb0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23  uffer */.){.  .#
11fc0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
11fd0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
11fe0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
11ff0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
12000 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12010 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79  TER(nFull);.  cy
12020 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c  gwin_conv_to_ful
12030 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65  l_win32_path(zRe
12040 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a  lative, zFull);.
12050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12060 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
12070 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
12080 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12090 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
120a0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53  _ERROR );.  UNUS
120b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
120c0 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  ll);.  /* WinCE 
120d0 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
120e0 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
120f0 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
12100 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c  m told. */.  sql
12110 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
12120 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
12130 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
12140 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72  lative);.  retur
12150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
12160 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
12170 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
12180 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
12190 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ).  int nByte;. 
121a0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
121b0 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
121c0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
121d0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
121e0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
121f0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
12200 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
12210 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
12220 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
12230 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
12240 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
12250 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
12260 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
12270 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
12280 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
12290 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
122a0 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
122b0 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
122c0 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
122d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
122e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
122f0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
12300 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20  AMETER(nFull);. 
12310 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
12320 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
12330 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  e(zRelative);.  
12340 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
12350 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70 3b 0a    WCHAR *zTemp;.
12360 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46      nByte = GetF
12370 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43  ullPathNameW((WC
12380 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
12390 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20   0, 0, 0) + 3;. 
123a0 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f     zTemp = mallo
123b0 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  c( nByte*sizeof(
123c0 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
123d0 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
123e0 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  .      free(zCon
123f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
12400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12410 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65  EM;.    }.    Ge
12420 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
12430 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
12440 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
12450 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43   0);.    free(zC
12460 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
12470 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  Out = unicodeToU
12480 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
12490 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20  free(zTemp);./* 
124a0 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
124b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
124c0 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
124d0 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
124e0 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
124f0 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
12500 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
12510 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
12520 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
12530 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
12540 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
12550 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
12560 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
12570 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
12580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
12590 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
125a0 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74  yte = GetFullPat
125b0 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
125c0 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
125d0 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d  0) + 3;.    zTem
125e0 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  p = malloc( nByt
125f0 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
12600 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
12610 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
12620 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
12630 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12640 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12650 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61   }.    GetFullPa
12660 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
12670 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
12680 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
12690 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
126a0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  );.    zOut = sq
126b0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
126c0 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
126d0 0a 20 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29  .    free(zTemp)
126e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
126f0 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73  f( zOut ){.    s
12700 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
12710 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12720 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
12730 4f 75 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  Out);.    free(z
12740 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
12750 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
12760 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
12770 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12780 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
12790 2a 20 47 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Get the sector
127a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 65 76   size of the dev
127b0 69 63 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  ice used to stor
127c0 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  e.** file..*/.st
127d0 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63 74  atic int getSect
127e0 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c 69  orSize(.    sqli
127f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20  te3_vfs *pVfs,. 
12800 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12810 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a 20  Relative     /* 
12820 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20  UTF-8 file name 
12830 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 62 79  */.){.  DWORD by
12840 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53  tesPerSector = S
12850 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
12860 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  CTOR_SIZE;.  /* 
12870 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
12880 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65   is not supporte
12890 64 20 75 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f  d under WINCE */
128a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
128b0 49 4e 43 45 0a 20 20 55 4e 55 53 45 44 5f 50 41  INCE.  UNUSED_PA
128c0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
128d0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
128e0 52 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65  R(zRelative);.#e
128f0 6c 73 65 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c  lse.  char zFull
12900 70 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  path[MAX_PATH+1]
12910 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  ;.  int rc;.  DW
12920 4f 52 44 20 64 77 52 65 74 20 3d 20 30 3b 0a 20  ORD dwRet = 0;. 
12930 20 44 57 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a   DWORD dwDummy;.
12940 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65  .  /*.  ** We ne
12950 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 66 75  ed to get the fu
12960 6c 6c 20 70 61 74 68 20 6e 61 6d 65 20 6f 66 20  ll path name of 
12970 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f  the file.  ** to
12980 20 67 65 74 20 74 68 65 20 64 72 69 76 65 20 6c   get the drive l
12990 65 74 74 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70  etter to look up
129a0 20 74 68 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a   the sector.  **
129b0 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 53 69   size..  */.  Si
129c0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
129d0 69 67 6e 28 31 29 3b 0a 20 20 72 63 20 3d 20 77  ign(1);.  rc = w
129e0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  inFullPathname(p
129f0 56 66 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  Vfs, zRelative, 
12a00 4d 41 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70  MAX_PATH, zFullp
12a10 61 74 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ath);.  Simulate
12a20 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
12a30 3b 0a 20 20 69 66 28 20 72 63 20 3d 3d 20 53 51  ;.  if( rc == SQ
12a40 4c 49 54 45 5f 4f 4b 20 29 0a 20 20 7b 0a 20 20  LITE_OK ).  {.  
12a50 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
12a60 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
12a70 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 70 61  Filename(zFullpa
12a80 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f  th);.    if( zCo
12a90 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
12aa0 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
12ab0 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70         /* trim p
12ac0 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76  ath to just driv
12ad0 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20  e reference */. 
12ae0 20 20 20 20 20 20 20 57 43 48 41 52 20 2a 70 20         WCHAR *p 
12af0 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
12b00 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b        for(;*p;p+
12b10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
12b20 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a  ( *p == '\\' ){.
12b30 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 20 3d              *p =
12b40 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
12b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12b60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12b70 20 20 20 20 20 20 20 20 64 77 52 65 74 20 3d 20          dwRet = 
12b80 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
12b90 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
12ba0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
12bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bc0 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
12bd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bf0 20 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63      &bytesPerSec
12c00 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c         &dwDummy,
12c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c50 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20     &dwDummy);.  
12c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c70 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 20     /* trim path 
12c80 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72 65  to just drive re
12c90 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20  ference */.     
12ca0 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
12cb0 61 72 20 2a 29 7a 43 6f 6e 76 65 72 74 65 64 3b  ar *)zConverted;
12cc0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70  .        for(;*p
12cd0 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ;p++){.         
12ce0 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20   if( *p == '\\' 
12cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
12d00 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  p = '\0';.      
12d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12d30 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65 74   }.        dwRet
12d40 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53 70   = GetDiskFreeSp
12d50 61 63 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  aceA((char*)zCon
12d60 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d            &dwDum
12d90 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  my,.            
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 26 62 79 74 65 73 50 65 72 53        &bytesPerS
12dc0 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  ector,.         
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12de0 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
12df0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a       &dwDummy);.
12e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72        }.      fr
12e30 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
12e40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
12e50 77 52 65 74 20 29 7b 0a 20 20 20 20 20 20 62 79  wRet ){.      by
12e60 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53  tesPerSector = S
12e70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
12e80 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  CTOR_SIZE;.    }
12e90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
12ea0 74 75 72 6e 20 28 69 6e 74 29 20 62 79 74 65 73  turn (int) bytes
12eb0 50 65 72 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23  PerSector; .}..#
12ec0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12ed0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
12ee0 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  N./*.** Interfac
12ef0 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
12f00 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
12f10 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
12f20 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
12f30 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
12f40 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
12f50 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
12f60 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74  ry..*/./*.** Int
12f70 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
12f80 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
12f90 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
12fa0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
12fb0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
12fc0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
12fd0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
12fe0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
12ff0 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
13000 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
13010 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
13020 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
13030 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64  HANDLE h;.  void
13040 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63   *zConverted = c
13050 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
13060 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
13070 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13080 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a  R(pVfs);.  if( z
13090 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
130a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
130b0 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  }.  if( isNT() )
130c0 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69  {.    h = LoadLi
130d0 62 72 61 72 79 57 28 28 57 43 48 41 52 2a 29 7a  braryW((WCHAR*)z
130e0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 2f 2a 20 69  Converted);./* i
130f0 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
13100 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
13110 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
13120 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
13130 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
13140 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66  ASCII version of
13150 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
13160 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
13170 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
13180 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
13190 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
131a0 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
131b0 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
131c0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
131d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20   }else{.    h = 
131e0 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68  LoadLibraryA((ch
131f0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
13200 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72  .#endif.  }.  fr
13210 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
13220 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
13230 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  h;.}.static void
13240 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69   winDlError(sqli
13250 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
13260 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
13270 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  BufOut){.  UNUSE
13280 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
13290 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f  );.  getLastErro
132a0 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 4f  rMsg(nBuf, zBufO
132b0 75 74 29 3b 0a 7d 0a 76 6f 69 64 20 28 2a 77 69  ut);.}.void (*wi
132c0 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  nDlSym(sqlite3_v
132d0 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
132e0 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63  pHandle, const c
132f0 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76  har *zSymbol))(v
13300 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  oid){.  UNUSED_P
13310 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
13320 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13330 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
13340 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
13350 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
13360 76 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63  vailable on winc
13370 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  e. */.  return (
13380 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 47 65  void(*)(void))Ge
13390 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
133a0 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a  ANDLE)pHandle, z
133b0 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20  Symbol);.#else. 
133c0 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77 69   /* All other wi
133d0 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20  ndows platforms 
133e0 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64  expect GetProcAd
133f0 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a  dress() to take.
13400 20 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74 72    ** an Ansi str
13410 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
13420 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73  f the _UNICODE s
13430 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75  etting */.  retu
13440 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
13450 29 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ))GetProcAddress
13460 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
13470 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64  , zSymbol);.#end
13480 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43  if.}.void winDlC
13490 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
134a0 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
134b0 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
134c0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
134d0 3b 0a 20 20 46 72 65 65 4c 69 62 72 61 72 79 28  ;.  FreeLibrary(
134e0 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
134f0 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  ;.}.#else /* if 
13500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
13510 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65  _EXTENSION is de
13520 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66  fined: */.  #def
13530 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30  ine winDlOpen  0
13540 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
13550 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
13560 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20  e winDlSym   0. 
13570 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c   #define winDlCl
13580 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  ose 0.#endif.../
13590 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
135a0 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
135b0 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
135c0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
135d0 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
135e0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
135f0 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
13600 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74  ar *zBuf){.  int
13610 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44   n = 0;.  UNUSED
13620 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
13630 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
13640 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d  LITE_TEST).  n =
13650 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28   nBuf;.  memset(
13660 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
13670 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
13680 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d  of(SYSTEMTIME)<=
13690 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59  nBuf-n ){.    SY
136a0 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20  STEMTIME x;.    
136b0 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78  GetSystemTime(&x
136c0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
136d0 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65  Buf[n], &x, size
136e0 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(x));.    n +=
136f0 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a   sizeof(x);.  }.
13700 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
13710 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
13720 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 47     DWORD pid = G
13730 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
13740 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
13750 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
13760 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
13770 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
13780 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  id);.  }.  if( s
13790 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
137a0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
137b0 44 20 63 6e 74 20 3d 20 47 65 74 54 69 63 6b 43  D cnt = GetTickC
137c0 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63  ount();.    memc
137d0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
137e0 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
137f0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
13800 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (cnt);.  }.  if(
13810 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
13820 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
13830 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
13840 47 45 52 20 69 3b 0a 20 20 20 20 51 75 65 72 79  GER i;.    Query
13850 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
13860 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63  er(&i);.    memc
13870 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c  py(&zBuf[n], &i,
13880 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20   sizeof(i));.   
13890 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b   n += sizeof(i);
138a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
138b0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
138c0 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
138d0 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
138e0 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
138f0 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
13900 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
13910 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
13920 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
13930 6f 73 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28  osec){.  Sleep((
13940 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
13950 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
13960 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
13970 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
13980 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
13990 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
139a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
139b0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
139c0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
139d0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
139e0 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
139f0 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
13a00 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
13a10 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
13a20 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
13a30 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
13a40 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
13a50 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
13a60 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
13a70 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
13a80 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
13a90 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
13aa0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
13ab0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
13ac0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
13ad0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
13ae0 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
13af0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
13b00 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
13b10 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
13b20 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
13b30 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
13b40 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
13b50 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
13b60 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
13b70 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
13b80 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
13b90 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
13ba0 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
13bb0 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
13bc0 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
13bd0 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
13be0 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
13bf0 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
13c00 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
13c10 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
13c20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
13c30 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
13c40 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
13c50 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
13c60 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
13c70 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
13c80 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
13c90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
13ca0 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
13cb0 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
13cc0 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
13cd0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
13ce0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
13cf0 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
13d00 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
13d10 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
13d20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
13d30 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49  . .  */.  FILETI
13d40 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20  ME ft;.  static 
13d50 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
13d60 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  t64 winFiletimeE
13d70 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a  poch = 23058135*
13d80 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
13d90 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53  640000;.#ifdef S
13da0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
13db0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
13dc0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
13dd0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
13de0 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
13df0 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  000;.#endif.  /*
13e00 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64   2^32 - to avoid
13e10 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77   use of LL and w
13e20 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a  arnings in gcc *
13e30 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
13e40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
13e50 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a  ax32BitValue = .
13e60 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
13e70 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
13e80 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
13e90 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73  )2000000000 + (s
13ea0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
13eb0 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
13ec0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
13ed0 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
13ee0 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28    GetSystemTime(
13ef0 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20  &time);.  /* if 
13f00 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
13f10 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74  Time() fails, it
13f20 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a   returns zero. *
13f30 2f 0a 20 20 69 66 20 28 21 53 79 73 74 65 6d 54  /.  if (!SystemT
13f40 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74  imeToFileTime(&t
13f50 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72  ime,&ft)){.    r
13f60 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6c  eturn 1;.  }.#el
13f70 73 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69  se.  GetSystemTi
13f80 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66  meAsFileTime( &f
13f90 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a  t );.#endif..  *
13fa0 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74  piNow = winFilet
13fb0 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20  imeEpoch +.     
13fc0 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74         ((((sqlit
13fd0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69  e3_int64)ft.dwHi
13fe0 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33  ghDateTime)*max3
13ff0 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20  2BitValue) + .  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
14010 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
14020 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73  wLowDateTime)/(s
14030 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30  qlite3_int64)100
14040 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  00;..#ifdef SQLI
14050 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
14060 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
14070 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
14080 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
14090 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
140a0 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
140b0 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
140c0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
140d0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
140e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
140f0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
14100 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
14110 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
14120 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
14130 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
14140 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
14150 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
14160 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
14170 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
14180 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
14190 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
141a0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
141b0 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72 72  ..*/.int winCurr
141c0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
141d0 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
141e0 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74  e *prNow){.  int
141f0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
14200 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77  nt64 i;.  rc = w
14210 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
14220 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20  64(pVfs, &i);.  
14230 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a  if( !rc ){.    *
14240 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
14250 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  00.0;.  }.  retu
14260 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14270 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
14280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
14290 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62  orks like a comb
142a0 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65  ination of.** Ge
142b0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64  tLastError() and
142c0 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29   FormatMessage()
142d0 20 6f 6e 20 77 69 6e 64 6f 77 73 20 28 6f 72 20   on windows (or 
142e0 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72  errno and.** str
142f0 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 75 6e 69  error_r() on uni
14300 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72  x). After an err
14310 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
14320 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74  y an OS.** funct
14330 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c  ion, SQLite call
14340 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
14350 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69  with zBuf pointi
14360 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  ng to.** a buffe
14370 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e  r of nBuf bytes.
14380 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68   The OS layer sh
14390 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68  ould populate th
143a0 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68  e.** buffer with
143b0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
143c0 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  d UTF-8 encoded 
143d0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
143e0 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
143f0 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f  last IO error to
14400 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77   have occurred w
14410 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ithin the callin
14420 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  g.** thread..**.
14430 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
14440 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  message is too l
14450 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70  arge for the sup
14460 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a  plied buffer,.**
14470 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72   it should be tr
14480 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74  uncated. The ret
14490 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65  urn value of xGe
144a0 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73  tLastError.** is
144b0 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
144c0 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
144d0 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
144e0 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
144f0 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
14500 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
14510 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a  cated). If non-z
14520 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
14530 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e  .** then it is n
14540 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
14550 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d  include the nul-
14560 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61  terminator chara
14570 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  cter.** in the o
14580 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a  utput buffer..**
14590 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e  .** Not supplyin
145a0 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
145b0 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  ge will have no 
145c0 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a  adverse effect.*
145d0 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20  * on SQLite. It 
145e0 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20  is fine to have 
145f0 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
14600 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20  n that never.** 
14610 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
14620 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20   message:.**.** 
14630 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72    int xGetLastEr
14640 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
14650 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
14660 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a   char *zBuf){.**
14670 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66       assert(zBuf
14680 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20  [0]=='\0');.**  
14690 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20     return 0;.** 
146a0 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65    }.**.** Howeve
146b0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  r if an error me
146c0 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65  ssage is supplie
146d0 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e  d, it will be in
146e0 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79  corporated.** by
146f0 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65   sqlite into the
14700 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
14710 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
14720 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  user using.** sq
14730 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20  lite3_errmsg(), 
14740 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20  possibly making 
14750 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72  IO errors easier
14760 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74   to debug..*/.st
14770 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
14780 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
14790 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
147a0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
147b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
147c0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
147d0 65 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72  eturn getLastErr
147e0 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66  orMsg(nBuf, zBuf
147f0 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  );.}..../*.** In
14800 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
14810 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
14820 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
14830 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
14840 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
14850 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
14860 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
14870 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
148a0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
148b0 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
148c0 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f  File */.    MAX_
148d0 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 20  PATH,           
148e0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
148f0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
14900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
14910 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
14920 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
14930 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
14940 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
14950 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
14960 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14980 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
14990 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
149a0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
149b0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
149c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
149d0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
149e0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
149f0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
14a00 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
14a10 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
14a20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
14a30 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
14a40 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
14a50 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
14a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
14a70 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
14a80 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
14a90 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
14aa0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
14ab0 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
14ac0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
14ad0 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
14ae0 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
14af0 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
14b00 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
14b10 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
14b20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
14b30 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
14b40 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
14b50 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
14b60 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
14b70 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
14b80 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
14b90 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74       /* xSetSyst
14ba0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 30 2c  emCall */.    0,
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
14bd0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Call */.    0,  
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
14c00 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 23 69 66  all */.  };..#if
14c10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14c20 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65  _WAL.  /* get me
14c30 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
14c40 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
14c50 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
14c60 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
14c70 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
14c80 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 49 6e 66  ;.  GetSystemInf
14c90 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
14ca0 20 20 61 73 73 65 72 74 28 77 69 6e 53 79 73 49    assert(winSysI
14cb0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
14cc0 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29  Granularity > 0)
14cd0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
14ce0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
14cf0 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20  (&winVfs, 1);.  
14d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14d10 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  ; .}.int sqlite3
14d20 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
14d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14d40 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
14d50 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
14d60 2f 0a                                            /.