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

Artifact 3d761e33687cb24645fe66e5efd11244390e8e9c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f 6e 6c 79  for windows only
0210: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f   */.../*.** A No
0220: 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79 20  te About Memory 
0230: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  Allocation:.**.*
0240: 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75 73  * This driver us
0250: 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65  es malloc()/free
0260: 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74 68  () directly rath
0270: 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74 68  er than going th
0280: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51 4c  rough.** the SQL
0290: 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71 6c  ite-wrappers sql
02a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71  ite3_malloc()/sq
02b0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20 54  lite3_free().  T
02c0: 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a 2a  hose wrappers.**
02d0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66 6f   are designed fo
02e0: 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64 65  r use on embedde
02f0: 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  d systems where 
0300: 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63 65  memory is scarce
0310: 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66   and.** malloc f
0320: 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66  ailures happen f
0330: 72 65 71 75 65 6e 74 6c 79 2e 20 20 57 69 6e 33  requently.  Win3
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 64 65 73  n windows.** des
0710: 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74 20 73 6f  ktops but not so
0720: 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65   well in embedde
0730: 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23  d systems..*/..#
0740: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65  include <winbase
0750: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59  .h>..#ifdef __CY
0760: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0770: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0780: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0790: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74  cros used to det
07a0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
07b0: 72 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72  r not to use thr
07c0: 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  eads..*/.#if def
07d0: 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
07e0: 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23   && THREADSAFE.#
07f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0800: 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  32_THREADS 1.#en
0810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75  dif../*.** Inclu
0820: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0830: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0840: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0850: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0860: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  n.h"../*.** Some
0870: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
0880: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
0890: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
08a0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
08b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
08c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
08d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
08e0: 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64  (DWORD)-1) .#end
08f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  if../*.** Determ
0900: 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64 65  ine if we are de
0910: 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64 6f  aling with Windo
0920: 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61 73  wsCE - which has
0930: 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75 63   a much.** reduc
0940: 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  ed API..*/.#if S
0950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
0960: 20 64 65 66 69 6e 65 20 41 72 65 46 69 6c 65 41   define AreFileA
0970: 70 69 73 41 4e 53 49 28 29 20 31 0a 23 20 64 65  pisANSI() 1.# de
0980: 66 69 6e 65 20 46 6f 72 6d 61 74 4d 65 73 73 61  fine FormatMessa
0990: 67 65 57 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  geW(a,b,c,d,e,f,
09a0: 67 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  g) 0.#endif../* 
09b0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
09c0: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
09d0: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
09e0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
09f0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
0a00: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
0a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a20: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
0a30: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
0a40: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
0a50: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  memory */../*.**
0a60: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0a70: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0a80: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0a90: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0aa0: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0ab0: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
0ad0: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
0ae0: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
0af0: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
0b00: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
0b10: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
0b20: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
0b30: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
0b40: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0b50: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
0b80: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
0b90: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
0ba0: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
0bb0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0bc0: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
0bd0: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0be0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0bf0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0c00: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
0c10: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
0c20: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
0c30: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
0c40: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
0c50: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
0c60: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
0c70: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
0ca0: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
0cb0: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
0cc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0cd0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
0ce0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
0cf0: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
0d00: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
0d10: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
0d20: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
0d30: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
0d60: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
0d70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
0d80: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
0d90: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
0da0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0db0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0dc0: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0dd0: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0de0: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0df0: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0e00: 63 6b 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  ck */.  DWORD la
0e10: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
0e20: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
0e30: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
0e40: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
0e50: 20 20 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69    DWORD sectorSi
0e60: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ze;       /* Sec
0e70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
0e80: 64 65 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f  device file is o
0e90: 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  n */.  winShm *p
0ea0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
0eb0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
0ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
0ed0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
0ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0ef0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0f00: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0f10: 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ile */.#if SQLIT
0f20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  E_OS_WINCE.  WCH
0f30: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
0f40: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
0f50: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
0f60: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
0f70: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
0f90: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
0fa0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
0fb0: 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48  ed lock */  .  H
0fc0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
0fd0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
0fe0: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
0ff0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1000: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1010: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
1020: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
1030: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
1040: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
1050: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
1060: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
1070: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
1080: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
1090: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  le  */.#endif.};
10a0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
10b0: 70 72 6f 74 6f 74 79 70 65 73 2e 0a 2a 2f 0a 73  prototypes..*/.s
10c0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63  tatic int getSec
10d0: 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c  torSize(.    sql
10e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
10f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1100: 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a  zRelative     /*
1110: 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65   UTF-8 file name
1120: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.);../*.** Th
1130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1140: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
1150: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
1160: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
1170: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
1180: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
1190: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11a0: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35 0a 2a  ystem is Win95.*
11b0: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
11c0: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
11d0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
11e0: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
11f0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
1200: 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  95..** 2:   Oper
1210: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
1220: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
1230: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
1240: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
1250: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
1260: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
1270: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
1280: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
1290: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
12a0: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
12b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12c0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
12d0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
12e0: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73  lse.static int s
12f0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1300: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1310: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
1320: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
1330: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
1340: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
1350: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
1360: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
1370: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
1380: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
1390: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
13a0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
13b0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
13c0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
13d0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
13e0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
13f0: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
1400: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
1410: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
1420: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
1430: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
1440: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
1450: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
1460: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
1470: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1480: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1490: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
14a0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
14b0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
14c0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
14d0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
14e0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
14f0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
1500: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
1510: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1520: 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20 69 73  INCE.# define is
1530: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a  NT()  (1).#else.
1540: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
1550: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
1560: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
1580: 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f  ERSIONINFO sInfo
1590: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
15a0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
15b0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
15c0: 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72 73  );.      GetVers
15d0: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
15e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
15f0: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
1600: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
1610: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
1620: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
1630: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1640: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
1650: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1660: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
1670: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1680: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
1690: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
16a0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
16b0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
16c0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
16d0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
16e0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
16f0: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
1700: 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  *utf8ToUnicode(c
1710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1720: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
1730: 61 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69  ar;.  WCHAR *zWi
1740: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
1750: 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65  Char = MultiByte
1760: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
1770: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
1780: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
1790: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
17a0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a  = malloc( nChar*
17b0: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
17c0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
17d0: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
17e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17f0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
1800: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
1810: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
1820: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
1830: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
1840: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
1850: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72  har==0 ){.    fr
1860: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
1870: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
1880: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
1890: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
18a0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
18b0: 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74  onvert microsoft
18c0: 20 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   unicode to UTF-
18d0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
18e0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
18f0: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
1900: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
1910: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
1920: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
1930: 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a  8(const WCHAR *z
1940: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
1950: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
1960: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
1970: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1980: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1990: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
19a0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
19b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  0, 0, 0);.  zFil
19c0: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
19d0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
19e0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
19f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a00: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
1a10: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
1a20: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
1a30: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
1a40: 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a  ilename, nByte,.
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
1a70: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
1a80: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65   == 0 ){.    fre
1a90: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1aa0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
1ab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
1ac0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1ad0: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e 73  * Convert an ans
1ae0: 69 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72  i string to micr
1af0: 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20 62  osoft unicode, b
1b00: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
1b10: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
1b20: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
1b30: 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53  e apis..** .** S
1b40: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1b50: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1b60: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
1b70: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
1b80: 73 74 61 74 69 63 20 57 43 48 41 52 20 2a 6d 62  static WCHAR *mb
1b90: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
1ba0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1bb0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
1bc0: 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62 63 73 46  .  WCHAR *zMbcsF
1bd0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
1be0: 6f 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c  odepage = AreFil
1bf0: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
1c00: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
1c10: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74  ..  nByte = Mult
1c20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
1c30: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
1c40: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
1c50: 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  ,0)*sizeof(WCHAR
1c60: 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  );.  zMbcsFilena
1c70: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1c80: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
1c90: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
1ca0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
1cb0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1cc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1cd0: 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  te = MultiByteTo
1ce0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
1cf0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
1d00: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
1d10: 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  me, nByte);.  if
1d20: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
1d30: 20 20 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65    free(zMbcsFile
1d40: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
1d50: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
1d60: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
1d70: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1d80: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f  ** Convert micro
1d90: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20  soft unicode to 
1da0: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
1db0: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
1dc0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
1dd0: 27 73 20 41 6e 73 69 20 63 6f 64 65 70 61 67 65  's Ansi codepage
1de0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
1df0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
1e00: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1e10: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
1e20: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
1e30: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
1e40: 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57 43 48 41  oMbcs(const WCHA
1e50: 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  R *zWideFilename
1e60: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
1e70: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1e80: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
1e90: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
1ea0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
1eb0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
1ec0: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1ed0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
1ee0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
1ef0: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
1f00: 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  0, 0);.  zFilena
1f10: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1f20: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
1f30: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
1f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f50: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
1f60: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
1f70: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
1f80: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
1f90: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
1fc0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
1fd0: 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  = 0 ){.    free(
1fe0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
1ff0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2000: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
2010: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
2020: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
2030: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
2040: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
2050: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
2060: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
2070: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
2080: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
2090: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
20a0: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
20b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
20c0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
20d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
20e0: 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69  .  WCHAR *zTmpWi
20f0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
2100: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
2110: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2120: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
2130: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2140: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
2150: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
2160: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
2170: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
2180: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
2190: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
21a0: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
21b0: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
21c0: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
21d0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
21e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
21f0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
2200: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
2210: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2220: 75 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74  utf8ToMbcs(const
2230: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2240: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
2250: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 57 43 48 41  nameMbcs;.  WCHA
2260: 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  R *zTmpWide;..  
2270: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
2280: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
2290: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
22a0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
22b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
22c0: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
22d0: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
22e0: 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a 54  Wide);.  free(zT
22f0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
2300: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
2310: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2320: 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  S_WINCE./*******
2330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69  **.** This secti
2380: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  on contains code
2390: 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e   for WinCE only.
23a0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .*/./*.** Window
23b0: 73 43 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  sCE does not hav
23c0: 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
23d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72  function.  So cr
23e0: 65 61 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69  eate a.** substi
23f0: 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tute..*/.#includ
2400: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
2410: 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
2420: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
2430: 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
2440: 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
2450: 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
2460: 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
2470: 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
2480: 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
2490: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
24a0: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
24b0: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
24c0: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
24d0: 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
24e0: 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
24f0: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
2500: 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
2510: 34 20 3e 3e 20 33 32 29 3b 0a 20 20 46 69 6c 65  4 >> 32);.  File
2520: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2530: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
2540: 20 20 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74    FileTimeToSyst
2550: 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d  emTime(&lTm,&pTm
2560: 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d  );.  y.tm_year =
2570: 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30   pTm.wYear - 190
2580: 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20  0;.  y.tm_mon = 
2590: 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a  pTm.wMonth - 1;.
25a0: 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54    y.tm_wday = pT
25b0: 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20  m.wDayOfWeek;.  
25c0: 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e  y.tm_mday = pTm.
25d0: 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75  wDay;.  y.tm_hou
25e0: 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20  r = pTm.wHour;. 
25f0: 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e   y.tm_min = pTm.
2600: 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f  wMinute;.  y.tm_
2610: 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e  sec = pTm.wSecon
2620: 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a  d;.  return &y;.
2630: 7d 0a 0a 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20  }../* This will 
2640: 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 2c  never be called,
2650: 20 62 75 74 20 64 65 66 69 6e 65 64 20 74 6f 20   but defined to 
2660: 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20 63 6f  make the code co
2670: 6d 70 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  mpile */.#define
2680: 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 61 2c   GetTempPathA(a,
2690: 62 29 0a 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b  b)..#define Lock
26a0: 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20  File(a,b,c,d,e) 
26b0: 20 20 20 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46        winceLockF
26c0: 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  ile(&a, b, c, d,
26d0: 20 65 29 0a 23 64 65 66 69 6e 65 20 55 6e 6c 6f   e).#define Unlo
26e0: 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65  ckFile(a,b,c,d,e
26f0: 29 20 20 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63  )     winceUnloc
2700: 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20  kFile(&a, b, c, 
2710: 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 4c 6f  d, e).#define Lo
2720: 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64  ckFileEx(a,b,c,d
2730: 2c 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63  ,e,f)   winceLoc
2740: 6b 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63  kFileEx(&a, b, c
2750: 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 23 64 65 66  , d, e, f)..#def
2760: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
2770: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
2780: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
2790: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
27a0: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
27b0: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
27c0: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
27d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
27e0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
27f0: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
2800: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
2810: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
2820: 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62   WaitForSingleOb
2830: 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45  ject(h, INFINITE
2840: 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64  );.   } while (d
2850: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a  wErr != WAIT_OBJ
2860: 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21  ECT_0 && dwErr !
2870: 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44  = WAIT_ABANDONED
2880: 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  );.}./*.** Relea
2890: 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72  se a lock acquir
28a0: 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78  ed by winceMutex
28b0: 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65  Acquire().*/.#de
28c0: 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52  fine winceMutexR
28d0: 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73  elease(h) Releas
28e0: 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a  eMutex(h)../*.**
28f0: 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65   Create the mute
2900: 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d  x and shared mem
2910: 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2920: 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65  king in the file
2930: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
2940: 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42  File.*/.static B
2950: 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74 65 4c  OOL winceCreateL
2960: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
2970: 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
2980: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43  le *pFile){.  WC
2990: 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48  HAR *zTok;.  WCH
29a0: 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75 74 66 38  AR *zName = utf8
29b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
29c0: 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e  ame);.  BOOL bIn
29d0: 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 2f 2a  it = TRUE;..  /*
29e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
29f0: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
2a00: 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 26  /.  ZeroMemory(&
2a10: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69  pFile->local, si
2a20: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
2a30: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
2a40: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
2a50: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
2a60: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
2a70: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
2a80: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
2a90: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43  e. */.  zTok = C
2aa0: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29  harLowerW(zName)
2ab0: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b  ;.  for (;*zTok;
2ac0: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20  zTok++){.    if 
2ad0: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20  (*zTok == '\\') 
2ae0: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d  *zTok = '_';.  }
2af0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70  ..  /* Create/op
2b00: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74  en the named mut
2b10: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68  ex */.  pFile->h
2b20: 4d 75 74 65 78 20 3d 20 43 72 65 61 74 65 4d 75  Mutex = CreateMu
2b30: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
2b40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
2b50: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
2b60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
2b70: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
2b80: 72 72 6f 72 28 29 3b 0a 20 20 20 20 66 72 65 65  rror();.    free
2b90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
2ba0: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
2bb0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
2bc0: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
2bd0: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
2be0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
2bf0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
2c00: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
2c10: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
2c20: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
2c30: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
2c40: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
2c50: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
2c60: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
2c70: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
2c80: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
2c90: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
2ca0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
2cb0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
2cc0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
2cd0: 20 20 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61    CharUpperW(zNa
2ce0: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
2cf0: 68 61 72 65 64 20 3d 20 43 72 65 61 74 65 46 69  hared = CreateFi
2d00: 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
2d10: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
2d20: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2d50: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
2d60: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
2d70: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
2da0: 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61  );  ..  /* Set a
2db0: 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
2dc0: 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66  ates we're the f
2dd0: 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74  irst to create t
2de0: 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20  he memory so it 
2df0: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
2e00: 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
2e10: 2f 0a 20 20 69 66 20 28 47 65 74 4c 61 73 74 45  /.  if (GetLastE
2e20: 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52 5f  rror() == ERROR_
2e30: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
2e40: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
2e50: 53 45 3b 0a 20 20 7d 0a 0a 20 20 66 72 65 65 28  SE;.  }..  free(
2e60: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
2e70: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
2e80: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
2e90: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2ea0: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
2eb0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
2ec0: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
2ed0: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
2ee0: 63 6b 2a 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ck*)MapViewOfFil
2ef0: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
2f00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2f10: 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
2f20: 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
2f30: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
2f40: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
2f50: 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
2f60: 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
2f70: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2f80: 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
2f90: 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d  .    if (!pFile-
2fa0: 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20  >shared){.      
2fb0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
2fc0: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
2fd0: 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61  );.      CloseHa
2fe0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
2ff0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
3000: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
3010: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
3020: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
3030: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
3040: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
3050: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
3060: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
3070: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
3080: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
3090: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
30a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30b0: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
30c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30d0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
30e0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
30f0: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
3100: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
3110: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
3120: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
3130: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
3140: 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20 20 20  f (bInit) {.    
3150: 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46 69 6c 65  ZeroMemory(pFile
3160: 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a 65 6f 66  ->shared, sizeof
3170: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
3180: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
3190: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
31a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
31b0: 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  TRUE;.}../*.** D
31c0: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
31d0: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
31e0: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
31f0: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
3200: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
3210: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
3220: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
3230: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
3240: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
3250: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
3260: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
3270: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
3280: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
3290: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
32a0: 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
32b0: 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
32c0: 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
32d0: 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
32e0: 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
32f0: 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
3300: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
3310: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
3320: 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
3330: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3340: 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
3350: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
3360: 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
3370: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3380: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
3390: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
33a0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
33b0: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
33c0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
33d0: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
33e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
33f0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
3400: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
3410: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3420: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
3430: 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
3440: 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
3450: 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
3460: 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
3470: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
3480: 0a 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66  .    UnmapViewOf
3490: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
34a0: 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  ed);.    CloseHa
34b0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
34c0: 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
34d0: 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
34e0: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
34f0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
3500: 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20  ->hMutex);    . 
3510: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3520: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
3530: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
3540: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
3550: 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  /* .** An implem
3560: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3570: 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
3580: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
3590: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
35a0: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
35b0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
35c0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
35d0: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
35e0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
35f0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
3600: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
3610: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
3620: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3630: 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
3640: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
3650: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
3660: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
3670: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
3680: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3690: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
36a0: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
36b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
36c0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
36d0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
36e0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
36f0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
3700: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
3710: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
3720: 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
3730: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
3740: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
3750: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
3760: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
3770: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
3780: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
3790: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
37a0: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
37b0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
37c0: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
37d0: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
37e0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
37f0: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
3800: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
3810: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
3820: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
3830: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
3840: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
3850: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3860: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
3870: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
3880: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3890: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
38a0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
38b0: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
38c0: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
38d0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
38e0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
38f0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3900: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
3910: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
3920: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
3930: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
3940: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
3950: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
3960: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3970: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
3980: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
3990: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
39a0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
39b0: 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
39c0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
39d0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
39e0: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
39f0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3a00: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3a10: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
3a20: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
3a30: 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
3a40: 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
3a50: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3a60: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
3a70: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
3a80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
3a90: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
3aa0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3ab0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
3ac0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3ad0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3ae0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
3af0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
3b00: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3b10: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3b20: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
3b30: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
3b40: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
3b50: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
3b60: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
3b70: 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
3b80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
3b90: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
3ba0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
3bb0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
3bc0: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
3bd0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
3be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
3bf0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
3c00: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
3c10: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
3c20: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
3c30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3c40: 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
3c50: 41 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66  API of windows f
3c60: 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74  or wince.*/.stat
3c70: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c  ic BOOL winceUnl
3c80: 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c  ockFile(.  HANDL
3c90: 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  E *phFile,.  DWO
3ca0: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  RD dwFileOffsetL
3cb0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  ow,.  DWORD dwFi
3cc0: 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  leOffsetHigh,.  
3cd0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
3ce0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c  ytesToUnlockLow,
3cf0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
3d00: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
3d10: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
3d20: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
3d30: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
3d40: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
3d50: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
3d60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3d70: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
3d80: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
3d90: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
3da0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
3db0: 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
3dc0: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
3dd0: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
3de0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
3df0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
3e00: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
3e10: 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20  ader lock or an 
3e20: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
3e30: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
3e40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
3e50: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b  D)SHARED_FIRST){
3e60: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68  .    /* Did we h
3e70: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
3e80: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66   lock? */.    if
3e90: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
3ea0: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
3eb0: 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
3ec0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
3ed0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
3ee0: 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  RED_SIZE);.     
3ef0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
3f00: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
3f10: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
3f20: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
3f30: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
3f40: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
3f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
3f60: 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  id we just have 
3f70: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a  a reader lock? *
3f80: 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70  /.    else if (p
3f90: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3fa0: 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73  ders){.      ass
3fb0: 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
3fc0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
3fd0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
3fe0: 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66  IZE || nNumberOf
3ff0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
4000: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
4010: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
4020: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
4030: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
4040: 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
4050: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
4060: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
4070: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
4080: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
4090: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
40a0: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
40b0: 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
40c0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
40d0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
40e0: 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
40f0: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
4100: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
4110: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
4120: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
4130: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
4140: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
4150: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
4160: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
4170: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
4180: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
4190: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
41a0: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
41b0: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
41c0: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
41d0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
41e0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
41f0: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
4200: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
4210: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
4220: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
4230: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
4240: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
4250: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
4260: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
4270: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
4280: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
4290: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
42a0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
42b0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
42c0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
42d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
42e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
42f0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
4300: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
4310: 45 78 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64  Ex() API of wind
4320: 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f  ows for wince.*/
4330: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
4340: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
4350: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
4360: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
4370: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
4380: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
4390: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
43a0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
43b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
43c0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
43d0: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
43e0: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
43f0: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
4400: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
4410: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
4420: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
4430: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
4440: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
4450: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
4460: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
4470: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
4480: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
4490: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
44a0: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
44b0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
44c0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
44d0: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
44e0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
44f0: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
4500: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
4510: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
4520: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
4530: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
4540: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
4550: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
4560: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
4570: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
4580: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
4590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45d0: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
45e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
45f0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4640: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
4650: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
4660: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
4670: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
4680: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
4690: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
46a0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
46b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
4700: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
4710: 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
4720: 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
4730: 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
4740: 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
4750: 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
4760: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
4770: 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
4780: 74 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20 69  t, but windows i
4790: 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
47a0: 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
47b0: 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
47c0: 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
47d0: 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
47e0: 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
47f0: 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
4800: 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
4810: 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
4820: 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
4830: 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
4840: 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
4850: 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
4860: 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
4870: 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
4880: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
4890: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
48a0: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
48b0: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
48c0: 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
48d0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
48e0: 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
48f0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
4900: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
4910: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
4920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
4930: 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20  e->pShm==0 );.  
4940: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
4950: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  %d\n", pFile->h)
4960: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  );.  do{.    rc 
4970: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  = CloseHandle(pF
4980: 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d 77 68 69 6c  ile->h);.  }whil
4990: 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
49a0: 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
49b0: 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70 28 31  EMPT && (Sleep(1
49c0: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
49d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
49e0: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
49f0: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
4a00: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
4a10: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
4a20: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
4a30: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
4a40: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4a50: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
4a60: 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46    DeleteFileW(pF
4a70: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
4a80: 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ose)==0.        
4a90: 26 26 20 47 65 74 46 69 6c 65 41 74 74 72 69 62  && GetFileAttrib
4aa0: 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
4ab0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
4ac0: 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
4ad0: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
4ae0: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
4af0: 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
4b00: 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 20 20     Sleep(100);  
4b10: 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
4b20: 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
4b30: 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
4b40: 20 20 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44    free(pFile->zD
4b50: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
4b60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
4b70: 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25  ACE(("CLOSE %d %
4b80: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
4b90: 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
4ba0: 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  led"));.  OpenCo
4bb0: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
4bc0: 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
4bd0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
4be0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  R;.}../*.** Some
4bf0: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
4c00: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
4c10: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
4c20: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
4c30: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
4c40: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
4c50: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
4c60: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
4c70: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
4c80: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
4c90: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
4ca0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4cb0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
4cc0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
4cd0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
4ce0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
4cf0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
4d00: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4d10: 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
4d20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4d40: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
4d50: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
4d80: 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
4d90: 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4dc0: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
4dd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
4de0: 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
4df0: 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
4e00: 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
4e10: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
4e20: 73 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  s = (LONG)((offs
4e30: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
4e40: 66 66 66 66 29 3b 0a 20 20 4c 4f 4e 47 20 6c 6f  ffff);.  LONG lo
4e50: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
4e60: 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
4e70: 66 66 66 66 29 3b 0a 20 20 44 57 4f 52 44 20 72  ffff);.  DWORD r
4e80: 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  c;.  winFile *pF
4e90: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
4ea0: 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f  id;.  DWORD erro
4eb0: 72 3b 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a  r;.  DWORD got;.
4ec0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
4ed0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
4ee0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
4ef0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
4f00: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
4f10: 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  D %d lock=%d\n",
4f20: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
4f30: 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
4f40: 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e  rc = SetFilePoin
4f50: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
4f60: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
4f70: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
4f80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56 41  ;.  if( rc==INVA
4f90: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
4fa0: 4e 54 45 52 20 26 26 20 28 65 72 72 6f 72 3d 47  NTER && (error=G
4fb0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
4fc0: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
4fd0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
4fe0: 20 3d 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65   = error;.    re
4ff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
5000: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 61  ;.  }.  if( !Rea
5010: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
5020: 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c  pBuf, amt, &got,
5030: 20 30 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   0) ){.    pFile
5040: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
5050: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
5060: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5070: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 0a  IOERR_READ;.  }.
5080: 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52    if( got==(DWOR
5090: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  D)amt ){.    ret
50a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
50b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 55   }else{.    /* U
50c0: 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
50d0: 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
50e0: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
50f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
5100: 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c  har*)pBuf)[got],
5110: 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20   0, amt-got);.  
5120: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5130: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
5140: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
5150: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
5160: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
5170: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
5180: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
5190: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
51a0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
51b0: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
51c0: 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
51d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
51e0: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
51f0: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69   File to write i
5200: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  nto */.  const v
5210: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
5220: 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20     /* The bytes 
5230: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
5240: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
5270: 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71  to write */.  sq
5280: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
5290: 65 74 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et      /* Offse
52a0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  t into the file 
52b0: 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67  to begin writing
52c0: 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47   at */.){.  LONG
52d0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
52e0: 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
52f0: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
5300: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
5310: 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
5320: 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
5330: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 69    DWORD rc;.  wi
5340: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
5350: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
5360: 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 44 57  WORD error;.  DW
5370: 4f 52 44 20 77 72 6f 74 65 20 3d 20 30 3b 0a 0a  ORD wrote = 0;..
5380: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
5390: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
53a0: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
53b0: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
53c0: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
53d0: 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
53e0: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20  SQLITE_FULL);.  
53f0: 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
5400: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
5410: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
5420: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 72 63  locktype));.  rc
5430: 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   = SetFilePointe
5440: 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
5450: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
5460: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
5470: 20 20 69 66 28 20 72 63 3d 3d 49 4e 56 41 4c 49    if( rc==INVALI
5480: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
5490: 45 52 20 26 26 20 28 65 72 72 6f 72 3d 47 65 74  ER && (error=Get
54a0: 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
54b0: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 70 46  _ERROR ){.    pF
54c0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
54d0: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
54e0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
54f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d    }.  assert( am
5500: 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 0a  t>0 );.  while(.
5510: 20 20 20 20 20 61 6d 74 3e 30 0a 20 20 20 20 20       amt>0.     
5520: 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46 69  && (rc = WriteFi
5530: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
5540: 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20  f, amt, &wrote, 
5550: 30 29 29 21 3d 30 0a 20 20 20 20 20 26 26 20 77  0))!=0.     && w
5560: 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20 20 20 20  rote>0.  ){.    
5570: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
5580: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
5590: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
55a0: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c    }.  if( !rc ||
55b0: 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20   amt>(int)wrote 
55c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
55d0: 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
55e0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65  tError();.    re
55f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
5600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5610: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5620: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
5630: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
5640: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
5650: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
5660: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
5670: 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
5680: 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
5690: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
56a0: 3d 20 28 4c 4f 4e 47 29 28 28 6e 42 79 74 65 3e  = (LONG)((nByte>
56b0: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
56c0: 66 29 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72  f);.  LONG lower
56d0: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 6e 42  Bits = (LONG)(nB
56e0: 79 74 65 20 26 20 30 78 66 66 66 66 66 66 66 66  yte & 0xffffffff
56f0: 29 3b 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74  );.  DWORD dwRet
5700: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
5710: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
5720: 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72  d;.  DWORD error
5730: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
5740: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
5750: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53  t( id!=0 );.  OS
5760: 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
5770: 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69   %d %lld\n", pFi
5780: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a  le->h, nByte));.
5790: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
57a0: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
57b0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
57c0: 0a 20 20 64 77 52 65 74 20 3d 20 53 65 74 46 69  .  dwRet = SetFi
57d0: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
57e0: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
57f0: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
5800: 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 64 77  BEGIN);.  if( dw
5810: 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54  Ret==INVALID_SET
5820: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26  _FILE_POINTER &&
5830: 20 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74 45   (error=GetLastE
5840: 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
5850: 52 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  R ){.    pFile->
5860: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f  lastErrno = erro
5870: 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
5880: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
5890: 45 3b 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  E;.  /* SetEndOf
58a0: 46 69 6c 65 20 77 69 6c 6c 20 66 61 69 6c 20 69  File will fail i
58b0: 66 20 6e 42 79 74 65 20 69 73 20 6e 65 67 61 74  f nByte is negat
58c0: 69 76 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ive */.  }else i
58d0: 66 28 20 21 53 65 74 45 6e 64 4f 66 46 69 6c 65  f( !SetEndOfFile
58e0: 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
58f0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
5900: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
5910: 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r();.    rc = SQ
5920: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
5930: 41 54 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ATE;.  }.  OSTRA
5940: 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE(("TRUNCATE %d
5950: 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69   %lld %s\n", pFi
5960: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63  le->h, nByte, rc
5970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
5980: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
5990: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
59a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
59b0: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
59c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
59d0: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
59e0: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
59f0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
5a00: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
5a10: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
5a20: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
5a30: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
5a40: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
5a50: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
5a60: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
5a70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
5a80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
5a90: 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
5aa0: 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
5ab0: 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
5ac0: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
5ad0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
5ae0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
5af0: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
5b00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
5b10: 5f 53 59 4e 43 0a 20 20 77 69 6e 46 69 6c 65 20  _SYNC.  winFile 
5b20: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5b30: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
5b40: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
5b50: 52 41 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c  RACE(("SYNC %d l
5b60: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
5b70: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
5b80: 74 79 70 65 29 29 3b 0a 23 65 6c 73 65 0a 20 20  type));.#else.  
5b90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5ba0: 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  (id);.#endif.#if
5bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  ndef SQLITE_TEST
5bc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
5bd0: 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73  TER(flags);.#els
5be0: 65 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  e.  if( flags & 
5bf0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
5c00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5c10: 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
5c20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5c30: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
5c40: 6e 64 69 66 0a 20 20 2f 2a 20 49 66 20 77 65 20  ndif.  /* If we 
5c50: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
5c60: 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
5c70: 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
5c80: 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
5c90: 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
5ca0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
5cb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5cc0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  _OK;.#else.  if(
5cd0: 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72   FlushFileBuffer
5ce0: 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  s(pFile->h) ){. 
5cf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5d00: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
5d10: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
5d20: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
5d30: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
5d40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
5d50: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
5d60: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
5d70: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
5d80: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
5d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
5da0: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
5db0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
5dc0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
5dd0: 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  ){.  DWORD upper
5de0: 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f  Bits;.  DWORD lo
5df0: 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69  werBits;.  winFi
5e00: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
5e10: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
5e20: 44 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65  D error;..  asse
5e30: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
5e40: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
5e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5e60: 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77  RR_FSTAT);.  low
5e70: 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65  erBits = GetFile
5e80: 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
5e90: 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 66  upperBits);.  if
5ea0: 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d  (   (lowerBits =
5eb0: 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53  = INVALID_FILE_S
5ec0: 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 65  IZE).     && ((e
5ed0: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
5ee0: 72 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52  ror()) != NO_ERR
5ef0: 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70 46  OR) ).  {.    pF
5f00: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
5f10: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
5f20: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
5f30: 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
5f40: 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
5f50: 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
5f60: 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
5f70: 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ts;.  return SQL
5f80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5f90: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
5fa0: 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
5fb0: 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
5fc0: 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
5fd0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
5fe0: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
5ff0: 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
6000: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
6010: 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
6020: 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
6030: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
6040: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
6050: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
6060: 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
6070: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
6080: 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
6090: 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  5 or WinNT..*/.s
60a0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
60b0: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
60c0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
60d0: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
60e0: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
60f0: 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e   ovlp;.    ovlp.
6100: 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f  Offset = SHARED_
6110: 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e  FIRST;.    ovlp.
6120: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a  OffsetHigh = 0;.
6130: 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20      ovlp.hEvent 
6140: 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  = 0;.    res = L
6150: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
6160: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
6170: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20  L_IMMEDIATELY,. 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49      0, SHARED_SI
61a0: 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f  ZE, 0, &ovlp);./
61b0: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
61c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
61d0: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
61e0: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
61f0: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
6200: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
6210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
6220: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
6230: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
6240: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
6250: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
6260: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
6270: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
6280: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
6290: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
62a0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
62b0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
62c0: 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
62d0: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
62e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
62f0: 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
6300: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
6310: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
6320: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
6330: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
6340: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
6350: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
6360: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
6370: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
6380: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
6390: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
63a0: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
63b0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
63c0: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
63d0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69  D_SIZE, 0);./* i
63e0: 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
63f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
6400: 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
6410: 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
6420: 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  . .*/.#if SQLITE
6430: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
6440: 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
6450: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
6460: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6470: 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  T + pFile->share
6480: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
6490: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
64a0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
64b0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
64c0: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
64d0: 45 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  Error();.  }.  r
64e0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
64f0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
6500: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
6510: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
6520: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
6530: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
6540: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
6550: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
6560: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
6570: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
6580: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
6590: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
65a0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
65b0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
65c0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
65d0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
65e0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
65f0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
6600: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
6610: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
6620: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
6630: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
6640: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
6650: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
6660: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
6670: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
6680: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
6690: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
66a0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
66b0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
66c0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
66d0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
66e0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
66f0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
6700: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
6710: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
6720: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
6730: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
6740: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
6750: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
6760: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
6770: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
6780: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
6790: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
67a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
67b0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
67c0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
67d0: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
67e0: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
67f0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
6800: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
6810: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
6820: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
6830: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
6840: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
6850: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
6860: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
6870: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
6880: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
6890: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
68a0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
68b0: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
68c0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
68d0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
68e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
68f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6900: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
6910: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
6920: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
6930: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77  /* Result of a w
6940: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
6950: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
6960: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
6970: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
6980: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
6990: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
69a0: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
69b0: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
69c0: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
69d0: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
69e0: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
69f0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
6a00: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
6a10: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d  .  DWORD error =
6a20: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
6a30: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
6a40: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
6a50: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
6a60: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
6a70: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
6a80: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
6a90: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
6aa0: 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20  edLockByte));.. 
6ab0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
6ac0: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
6ad0: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
6ae0: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
6af0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
6b00: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
6b10: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
6b20: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
6b30: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
6b40: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
6b50: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
6b60: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
6b70: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
6b80: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
6b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6ba0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
6bb0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
6bc0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
6bd0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
6be0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
6bf0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
6c00: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
6c10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
6c20: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
6c30: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
6c40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
6c50: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
6c60: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
6c70: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
6c80: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
6c90: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
6ca0: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
6cb0: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
6cc0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
6cd0: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
6ce0: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
6cf0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
6d00: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
6d10: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
6d20: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
6d30: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
6d40: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
6d50: 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
6d60: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
6d70: 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
6d80: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
6d90: 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
6da0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
6db0: 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
6dc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
6dd0: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
6de0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
6df0: 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
6e00: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
6e10: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
6e20: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
6e30: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
6e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6e50: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
6e60: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
6e70: 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e  ock.  The pendin
6e80: 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a  g lock might be.
6e90: 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79        ** held by
6ea0: 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20   another reader 
6eb0: 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c  process who will
6ec0: 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65   release it mome
6ed0: 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a  ntarily..      *
6ee0: 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
6ef0: 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
6f00: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
6f10: 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
6f20: 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29  ;.      Sleep(1)
6f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
6f40: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
6f50: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
6f60: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
6f70: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
6f80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6f90: 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
6fa0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
6fb0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
6fc0: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
6fd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
6fe0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
6ff0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
7000: 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70   = getReadLock(p
7010: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
7020: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7030: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
7040: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
7050: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
7060: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
7070: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7080: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
7090: 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
70a0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
70b0: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
70c0: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
70d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
70e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
70f0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
7100: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
7110: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
7120: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
7130: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7140: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
7150: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
7160: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7170: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7190: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
71a0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
71b0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
71c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
71d0: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
71e0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
71f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
7200: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
7210: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
7220: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
7230: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
7240: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
7250: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
7260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
7270: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
7280: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
7290: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
72a0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
72b0: 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65    OSTRACE(("unre
72c0: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
72d0: 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  res));.    res =
72e0: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
72f0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
7300: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
7310: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
7320: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
7330: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
7340: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
7350: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7360: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7370: 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
7380: 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25  ("error-code = %
7390: 64 5c 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20  d\n", error));. 
73a0: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
73b0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
73c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
73d0: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
73e0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
73f0: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
7400: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
7410: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
7420: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
7430: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
7440: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
7450: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7460: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
7470: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
7480: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
7490: 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
74a0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
74b0: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
74c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
74d0: 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
74e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
74f0: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
7500: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
7510: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
7530: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49  TRACE(("LOCK FAI
7540: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
7550: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
7560: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
7570: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
7580: 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
7590: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
75a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
75b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
75c0: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  BUSY;.  }.  pFil
75d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
75e0: 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
75f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7610: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
7620: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
7630: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
7640: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
7650: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
7660: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
7670: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
7680: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
7690: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
76a0: 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
76b0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
76c0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
76d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
76e0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
76f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
7700: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
7710: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
7720: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
7730: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
7740: 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
7750: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
7760: 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
7770: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
7780: 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  d %d (local)\n",
7790: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
77a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
77b0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
77c0: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
77d0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
77e0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
77f0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
7800: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
7810: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
7820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
7830: 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  !rc;.    OSTRACE
7840: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
7850: 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  %d %d (remote)\n
7860: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
7870: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
7880: 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
7890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
78a0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
78b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
78c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
78d0: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
78e0: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
78f0: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
7900: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
7910: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
7920: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
7930: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
7940: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
7950: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
7960: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
7970: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
7980: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
7990: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
79a0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
79b0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
79c0: 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
79d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
79e0: 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
79f0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
7a00: 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
7a10: 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
7a20: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
7a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7a40: 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERR;.*/.static i
7a50: 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c  nt winUnlock(sql
7a60: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7a70: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
7a80: 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46  int type;.  winF
7a90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
7aa0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
7ab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
7ad0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ae0: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
7af0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52  D_LOCK );.  OSTR
7b00: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20  ACE(("UNLOCK %d 
7b10: 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29  to %d was %d(%d)
7b20: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
7b30: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
7b40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
7b50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
7b60: 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74  dLockByte));.  t
7b70: 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
7b80: 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
7b90: 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_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 53 48  ile(pFile->h, SH
7bc0: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
7bd0: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
7be0: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
7bf0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
7c00: 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46   !getReadLock(pF
7c10: 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
7c20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
7c30: 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
7c40: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7c50: 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
7c60: 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
7c70: 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
7c80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
7c90: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
7ca0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
7cb0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
7cc0: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
7cd0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
7ce0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
7cf0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
7d00: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
7d10: 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
7d20: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c  _LOCK ){.    unl
7d30: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
7d40: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  e);.  }.  if( ty
7d50: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
7d60: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
7d70: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
7d80: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
7d90: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
7da0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
7db0: 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74  )locktype;.  ret
7dc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7dd0: 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65   Control and que
7de0: 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  ry of the open f
7df0: 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
7e00: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
7e10: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
7e20: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
7e30: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
7e40: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
7e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7e60: 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
7e70: 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
7e80: 70 41 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65  pArg = ((winFile
7e90: 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
7ea0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7eb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
7ec0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
7ed0: 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
7ee0: 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
7ef0: 20 28 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a   (int)((winFile*
7f00: 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  )id)->lastErrno;
7f10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7f20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
7f30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
7f40: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
7f50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7f60: 69 6e 74 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c  int64 sz = *(sql
7f70: 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
7f80: 3b 0a 20 20 20 20 20 20 77 69 6e 54 72 75 6e 63  ;.      winTrunc
7f90: 61 74 65 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20  ate(id, sz);.   
7fa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7fb0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
7fc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
7fd0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
7fe0: 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
7ff0: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
8000: 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
8010: 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
8020: 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
8030: 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
8040: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
8050: 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
8060: 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
8070: 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
8080: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
8090: 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
80a0: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
80b0: 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
80c0: 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
80d0: 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
80e0: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
80f0: 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
8100: 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
8110: 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
8120: 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
8130: 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
8140: 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
8150: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
8160: 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
8170: 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
8180: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
8190: 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  id){.  assert( i
81a0: 64 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  d!=0 );.  return
81b0: 20 28 69 6e 74 29 28 28 28 77 69 6e 46 69 6c 65   (int)(((winFile
81c0: 2a 29 69 64 29 2d 3e 73 65 63 74 6f 72 53 69 7a  *)id)->sectorSiz
81d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
81e0: 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
81f0: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
8200: 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
8210: 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
8220: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
8230: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
8240: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
8250: 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65 74 75  ETER(id);.  retu
8260: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  rn 0;.}../******
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82b0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 20 53 68 61 72 65 64 20  ******** Shared 
82e0: 4d 65 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  Memory *********
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8300: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
8310: 65 78 74 20 73 75 62 64 69 76 69 73 69 6f 6e 20  ext subdivision 
8320: 6f 66 20 63 6f 64 65 20 6d 61 6e 61 67 65 73 20  of code manages 
8330: 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
8340: 79 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2f  y primitives..*/
8350: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8360: 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
8370: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
8380: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
8390: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
83a0: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
83b0: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
83c0: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
83d0: 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e  ct the winLockIn
83e0: 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  fo objects used 
83f0: 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65  by .** this file
8400: 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
8410: 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20  ay be shared by 
8420: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
8430: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
8440: 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
8450: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
8460: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
8470: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
8480: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
8490: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
84a0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
84b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
84c0: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
84d0: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
84e0: 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
84f0: 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
8500: 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
8510: 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
8520: 77 69 6e 45 6e 74 65 72 4c 65 61 76 65 28 29 0a  winEnterLeave().
8530: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
8540: 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
8550: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
8560: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
8570: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
8580: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
8590: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
85a0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
85b0: 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
85c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
85d0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
85e0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
85f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
8600: 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
8610: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
8620: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
8630: 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
8640: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
8650: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
8660: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
8670: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
8680: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
8690: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
86a0: 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
86b0: 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
86c0: 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
86d0: 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
86e0: 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
86f0: 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
8700: 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
8710: 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
8720: 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
8730: 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
8740: 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
8750: 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
8760: 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
8770: 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
8780: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
8790: 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
87a0: 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
87b0: 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
87c0: 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
87d0: 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
87e0: 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
87f0: 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
8800: 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
8810: 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
8820: 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
8830: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
8840: 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
8850: 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
8860: 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
8870: 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
8880: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8890: 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
88a0: 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
88b0: 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
88c0: 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
88d0: 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
88e0: 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
88f0: 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
8900: 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
8910: 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
8920: 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
8930: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
8940: 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
8950: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
8960: 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
8970: 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
8980: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  ure..**.** To av
8990: 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c 20 6d  oid deadlocks, m
89a0: 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78 42 75  utex and mutexBu
89b0: 66 20 61 72 65 20 61 6c 77 61 79 73 20 72 65 6c  f are always rel
89c0: 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  eased in the.** 
89d0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68  reverse order th
89e0: 61 74 20 74 68 65 79 20 61 72 65 20 61 63 71 75  at they are acqu
89f0: 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75 66 20  ired.  mutexBuf 
8a00: 69 73 20 61 6c 77 61 79 73 20 61 63 71 75 69 72  is always acquir
8a10: 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64 20  ed.** first and 
8a20: 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e 20 20  released last.  
8a30: 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  This invariant i
8a40: 73 20 63 68 65 63 6b 20 62 79 20 61 73 73 65 72  s check by asser
8a50: 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ting.** sqlite3_
8a60: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20  mutex_notheld() 
8a70: 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65 76 65  on mutex wheneve
8a80: 72 20 6d 75 74 65 78 42 75 66 20 69 73 20 61 63  r mutexBuf is ac
8a90: 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72 65 6c  quired or.** rel
8aa0: 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  eased..*/.struct
8ab0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20   winShmNode {.  
8ac0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
8ad0: 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75  utex;      /* Mu
8ae0: 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68  tex to access th
8af0: 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  is object */.  c
8b00: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
8b10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
8b20: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  e of the file */
8b30: 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65  .  winFile hFile
8b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8b50: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
8b60: 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20  m winOpen */..  
8b70: 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
8b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
8b90: 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
8ba0: 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
8bb0: 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20   int nRegion;   
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8bd0: 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
8be0: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  egion */.  struc
8bf0: 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20  t ShmRegion {.  
8c00: 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20    HANDLE hMap;  
8c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8c20: 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43  le handle from C
8c30: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8c40: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d   */.    void *pM
8c50: 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e  ap;.  } *aRegion
8c60: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
8c70: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rno;           /
8c80: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
8c90: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
8ca0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a  t I/O error */..
8cb0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cd0: 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d  Number of winShm
8ce0: 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
8cf0: 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
8d00: 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20  inShm *pFirst;  
8d10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
8d20: 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
8d30: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
8d40: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
8d50: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
8d60: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74   /* Next in list
8d70: 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
8d80: 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69  de objects */.#i
8d90: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8da0: 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  G.  u8 nextShmId
8db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8dc0: 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
8dd0: 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65   winShm.id value
8de0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
8df0: 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72  *.** A global ar
8e00: 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ray of all winSh
8e10: 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a  mNode objects..*
8e20: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d  *.** The winShmM
8e30: 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
8e40: 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65  be true while re
8e50: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
8e60: 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73   this list..*/.s
8e70: 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65  tatic winShmNode
8e80: 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74   *winShmNodeList
8e90: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72   = 0;../*.** Str
8ea0: 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
8eb0: 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
8ec0: 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
8ed0: 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
8ee0: 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
8ef0: 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
8f00: 2a 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 46 69 6c  *.** winShm.pFil
8f10: 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
8f20: 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65 61 64   held while read
8f30: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
8f40: 68 65 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 4e 65  he.** winShm.pNe
8f50: 78 74 20 61 6e 64 20 77 69 6e 53 68 6d 2e 6c 6f  xt and winShm.lo
8f60: 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e 74 73 2e 0a  cks[] elements..
8f70: 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
8f80: 2e 70 46 69 6c 65 20 65 6c 65 6d 65 6e 74 20 69  .pFile element i
8f90: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  s initialized wh
8fa0: 65 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  en the object is
8fb0: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
8fc0: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  is read-only the
8fd0: 72 65 61 66 74 65 72 2e 0a 2a 2f 0a 73 74 72 75  reafter..*/.stru
8fe0: 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
8ff0: 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
9000: 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
9010: 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
9020: 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
9030: 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9050: 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
9060: 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
9070: 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
9080: 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
9090: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
90a0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
90b0: 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
90c0: 20 20 75 38 20 68 61 73 4d 75 74 65 78 42 75 66    u8 hasMutexBuf
90d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
90e0: 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
90f0: 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66 20  pFile->mutexBuf 
9100: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
9110: 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20  _DEBUG.  u8 id; 
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
9140: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
9150: 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
9160: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9170: 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
9180: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
9190: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
91a0: 48 4d 5f 42 41 53 45 20 20 20 28 28 31 38 2b 53  HM_BASE   ((18+S
91b0: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
91c0: 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
91d0: 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
91e0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
91f0: 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
9200: 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
9210: 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
9220: 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
9230: 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
9240: 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
9250: 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
9260: 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
9270: 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c  #define _SHM_UNL
9280: 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53  CK  1.#define _S
9290: 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
92a0: 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20  ine _SHM_WRLCK  
92b0: 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
92c0: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
92d0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
92e0: 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
92f0: 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
9300: 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
9310: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
9320: 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
9330: 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43      /* _SHM_UNLC
9340: 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  K, _SHM_RDLCK, o
9350: 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a  r _SHM_WRLCK */.
9360: 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
9370: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9380: 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
9390: 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c  to be locked/unl
93a0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocked */.  int n
93b0: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
93c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
93d0: 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  tes to lock or u
93e0: 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f 56  nlock */.){.  OV
93f0: 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
9400: 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 3b 0a   DWORD dwFlags;.
9410: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
9420: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
9430: 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
9440: 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
9450: 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
9460: 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
9470: 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
9480: 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
9490: 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
94a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
94b0: 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
94c0: 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
94d0: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  f==0 );..  /* In
94e0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
94f0: 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
9500: 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d 20 4c  */.  dwFlags = L
9510: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
9520: 45 44 49 41 54 45 4c 59 3b 0a 20 20 69 66 28 20  EDIATELY;.  if( 
9530: 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
9540: 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
9550: 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
9560: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20  LUSIVE_LOCK;..  
9570: 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73  /* Find the firs
9580: 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61 73  t bit in lockMas
9590: 6b 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f  k that is set */
95a0: 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c  .  memset(&ovlp,
95b0: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
95c0: 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e  APPED));.  ovlp.
95d0: 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a  Offset = ofst;..
95e0: 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
95f0: 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
9600: 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
9610: 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
9620: 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
9630: 72 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45  rc = UnlockFileE
9640: 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  x(pFile->hFile.h
9650: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26  , 0, nByte, 0, &
9660: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
9670: 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c      rc = LockFil
9680: 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65  eEx(pFile->hFile
9690: 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20  .h, dwFlags, 0, 
96a0: 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29  nByte, 0, &ovlp)
96b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20  ;.  }.  if( !rc 
96c0: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
96d0: 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20  "SHM-LOCK %d %s 
96e0: 45 52 52 4f 52 20 30 78 25 30 38 6c 78 5c 6e 22  ERROR 0x%08lx\n"
96f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
9700: 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  pFile->hFile.h,.
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63               loc
9720: 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
9730: 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45  K ? "UnlockFileE
9740: 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78  x" : "LockFileEx
9750: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9760: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
9770: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 28 72 63  ;.  }.  rc = (rc
9780: 21 3d 30 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  !=0) ? SQLITE_OK
9790: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
97a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
97b0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
97c0: 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
97d0: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
97e0: 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
97f0: 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
9800: 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
9810: 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
9820: 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
9830: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
9840: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
9850: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
9860: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
9870: 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
9880: 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
9890: 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
98a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
98b0: 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
98c0: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
98d0: 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
98e0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
98f0: 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
9900: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
9910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9920: 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
9930: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
9940: 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
9950: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
9960: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
9970: 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
9980: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
9990: 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
99a0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
99b0: 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
99c0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
99d0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
99e0: 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
99f0: 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74 65  ->mutex ) sqlite
9a00: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
9a10: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66 6f  mutex);.      fo
9a20: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
9a30: 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
9a40: 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69     UnmapViewOfFi
9a50: 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
9a60: 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
9a70: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61  CloseHandle(p->a
9a80: 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b  Region[i].hMap);
9a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9aa0: 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d  f( p->hFile.h !=
9ab0: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
9ac0: 56 41 4c 55 45 20 29 20 7b 0a 20 20 20 20 20 20  VALUE ) {.      
9ad0: 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69    winClose((sqli
9ae0: 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68  te3_file *)&p->h
9af0: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
9b00: 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
9b10: 6c 61 67 20 29 20 77 69 6e 44 65 6c 65 74 65 28  lag ) winDelete(
9b20: 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
9b30: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 2a 70  me, 0);.      *p
9b40: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
9b50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b60: 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
9b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9b80: 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
9b90: 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
9ba0: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
9bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
9bc0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
9bd0: 65 61 2e 20 20 54 68 69 73 20 70 61 72 74 69 63  ea.  This partic
9be0: 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ular implementat
9bf0: 69 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70  ion uses.** mmap
9c00: 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
9c10: 20 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c 65   zName is a file
9c20: 6e 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65  name used to ide
9c30: 6e 74 69 66 79 20 74 68 65 20 73 68 61 72 65 64  ntify the shared
9c40: 2d 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54  -memory area.  T
9c50: 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  he.** implementa
9c60: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61  tion does not (a
9c70: 6e 64 20 70 65 72 68 61 70 73 20 73 68 6f 75 6c  nd perhaps shoul
9c80: 64 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73 20  d not) use this 
9c90: 6e 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79  name.** directly
9ca0: 2c 20 62 75 74 20 72 61 74 68 65 72 20 75 73 65  , but rather use
9cb0: 20 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61 74   it as a templat
9cc0: 65 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e  e for finding an
9cd0: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
9ce0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68 61  name for the sha
9cf0: 72 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61  red-memory stora
9d00: 67 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70  ge.  In this imp
9d10: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65  lementation, the
9d20: 0a 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e 64  .** string "-ind
9d30: 65 78 22 20 69 73 20 61 70 70 65 6e 64 65 64 20  ex" is appended 
9d40: 74 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65  to zName and use
9d50: 64 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  d as the name of
9d60: 20 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20   the.** mmapped 
9d70: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  file..**.** When
9d80: 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
9d90: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
9da0: 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
9db0: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
9dc0: 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
9dd0: 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
9de0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
9df0: 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
9e00: 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
9e10: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
9e20: 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
9e30: 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
9e40: 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
9e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9e60: 77 69 6e 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71  winShmOpen(.  sq
9e70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
9e80: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
9e90: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 74 74 61  to which to atta
9ea0: 63 68 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ch shared memory
9eb0: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
9ec0: 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9ee0: 61 74 61 62 61 73 65 20 74 6f 20 77 68 69 63 68  atabase to which
9ef0: 20 74 6f 20 61 74 74 61 63 68 20 53 48 4d 20 2a   to attach SHM *
9f00: 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
9f10: 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
9f20: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9f30: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
9f40: 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
9f50: 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
9f60: 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
9f70: 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
9f80: 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
9f90: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
9fc0: 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
9fd0: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
9fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9ff0: 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
a000: 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
a010: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
a040: 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
a050: 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69    pDbFd = (winFi
a060: 6c 65 2a 29 66 64 3b 0a 20 20 61 73 73 65 72 74  le*)fd;.  assert
a070: 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
a080: 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
a090: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
a0a0: 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
a0b0: 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
a0c0: 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
a0d0: 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
a0e0: 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
a0f0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
a100: 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
a110: 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
a120: 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
a130: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
a140: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
a150: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
a160: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a170: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
a180: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d  eof(*p));.  nNam
a190: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
a1a0: 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  n30(pDbFd->zPath
a1b0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
a1c0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
a1d0: 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
a1e0: 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20  nName + 15 );.  
a1f0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
a200: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a210: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
a220: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a230: 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20  .  memset(pNew, 
a240: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
a250: 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  );.  pNew->zFile
a260: 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
a270: 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
a280: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
a290: 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
a2a0: 6e 61 6d 65 2c 20 22 25 73 2d 77 61 6c 2d 69 6e  name, "%s-wal-in
a2b0: 64 65 78 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  dex", pDbFd->zPa
a2c0: 74 68 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  th);..  /* Look 
a2d0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
a2e0: 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
a2f0: 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
a300: 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
a310: 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
a320: 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
a330: 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
a340: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
a350: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
a360: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
a370: 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
a380: 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
a390: 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
a3a0: 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
a3b0: 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
a3c0: 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
a3d0: 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
a3e0: 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
a3f0: 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
a400: 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
a410: 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
a420: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
a430: 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
a440: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
a450: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
a460: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
a470: 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
a480: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a490: 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
a4a0: 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
a4b0: 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
a4c0: 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
a4d0: 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
a4e0: 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
a4f0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
a500: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
a510: 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
a520: 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
a530: 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
a540: 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
a550: 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
a560: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
a570: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
a580: 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
a590: 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
a5a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
a5b0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
a5c0: 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
a5d0: 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rr;.    }.    rc
a5e0: 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
a5f0: 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
a600: 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
a610: 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
a620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
a630: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
a640: 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
a650: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
a660: 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
a670: 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
a680: 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
a690: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
a6a0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
a6b0: 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
a6c0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
a6d0: 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  /* Mode flags */
a6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a6f0: 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51    0);.    if( SQ
a700: 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
a710: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a720: 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
a730: 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
a740: 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
a750: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
a760: 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
a770: 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
a780: 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
a790: 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
a7a0: 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
a7b0: 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
a7c0: 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a  length. .    */.
a7d0: 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79      if( winShmSy
a7e0: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
a7f0: 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57  e, _SHM_WRLCK, W
a800: 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d  IN_SHM_DMS, 1)==
a810: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a820: 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
a830: 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
a840: 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
a850: 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  File, 0);.    }.
a860: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a870: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77  TE_OK ){.      w
a880: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
a890: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
a8a0: 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
a8b0: 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20  S, 1);.      rc 
a8c0: 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
a8d0: 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
a8e0: 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
a8f0: 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
a900: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
a910: 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
a920: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
a930: 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
a940: 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
a950: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
a960: 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
a970: 53 68 6d 4e 6f 64 65 3b 0a 20 20 70 2d 3e 70 4e  ShmNode;.  p->pN
a980: 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
a990: 70 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53  pFirst;.#ifdef S
a9a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
a9b0: 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
a9c0: 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
a9d0: 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
a9e0: 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 70 53  pFirst = p;.  pS
a9f0: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
aa00: 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
aa10: 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  p;.  winShmLeave
aa20: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
aa30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
aa40: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
aa50: 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
aa60: 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
aa70: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
aa80: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
aa90: 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
aaa0: 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
aab0: 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
aac0: 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
aad0: 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
aae0: 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
aaf0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
ab00: 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
ab10: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
ab20: 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
ab30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ab40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ab50: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
ab60: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
ab70: 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
ab80: 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
ab90: 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
aba0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
abb0: 63 20 69 6e 74 20 77 69 6e 53 68 6d 43 6c 6f 73  c int winShmClos
abc0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
abd0: 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
abe0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
abf0: 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
ac00: 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
ac10: 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
ac20: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
ac30: 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
ac40: 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
ac50: 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
ac60: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
ac70: 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
ac80: 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
ac90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
aca0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
acb0: 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
acc0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
acd0: 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
ace0: 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
acf0: 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
ad00: 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
ad10: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
ad20: 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
ad30: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
ad40: 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
ad50: 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
ad60: 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
ad70: 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
ad80: 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
ad90: 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
ada0: 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
adb0: 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
adc0: 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
add0: 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
ade0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
adf0: 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
ae00: 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
ae10: 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
ae20: 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
ae30: 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
ae40: 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
ae50: 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
ae60: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
ae70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
ae80: 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
ae90: 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
aea0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
aeb0: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
aec0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
aed0: 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
aee0: 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
aef0: 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
af00: 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
af10: 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
af20: 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
af30: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
af40: 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
af50: 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
af60: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
af70: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
af80: 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
af90: 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
afa0: 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
afb0: 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
afc0: 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
afd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
afe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
aff0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
b000: 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
b010: 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
b020: 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
b030: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
b040: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
b050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b060: 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
b070: 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
b080: 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
b090: 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
b0a0: 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
b0b0: 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
b0c0: 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
b0d0: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
b0e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
b0f0: 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
b100: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
b110: 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
b120: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
b130: 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
b140: 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
b150: 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
b160: 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
b170: 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
b180: 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
b190: 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
b1a0: 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
b1b0: 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
b1c0: 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
b1d0: 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
b1e0: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
b1f0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
b200: 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
b210: 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
b220: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
b230: 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
b240: 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
b250: 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
b260: 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
b270: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
b280: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
b290: 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
b2a0: 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
b2b0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
b2c0: 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
b2d0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
b2e0: 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
b2f0: 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
b300: 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
b310: 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
b320: 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
b330: 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
b340: 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
b350: 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
b360: 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
b370: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
b380: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
b390: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
b3a0: 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
b3b0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
b3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
b3d0: 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
b3e0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
b3f0: 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
b420: 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
b430: 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
b440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b450: 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
b460: 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
b490: 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
b4a0: 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
b4b0: 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b4d0: 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
b4e0: 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
b4f0: 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
b500: 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
b510: 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
b520: 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
b530: 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
b540: 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
b550: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b560: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b570: 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
b580: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
b590: 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68  t( szRegion==pSh
b5a0: 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
b5b0: 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
b5c0: 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  gion==0 );..  if
b5d0: 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
b5e0: 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
b5f0: 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65      struct ShmRe
b600: 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20  gion *apNew;    
b610: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52         /* New aR
b620: 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f  egion[] array */
b630: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
b640: 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52   (iRegion+1)*szR
b650: 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d  egion;  /* Minim
b660: 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65  um required file
b670: 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c   size */.    sql
b680: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20  ite3_int64 sz;  
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20  /* Current size 
b6b0: 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  of wal-index fil
b6c0: 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  e */..    pShmNo
b6d0: 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
b6e0: 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a  zRegion;..    /*
b6f0: 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72   The requested r
b700: 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70  egion is not map
b710: 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
b720: 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
b730: 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68  space..    ** Ch
b740: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
b750: 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
b760: 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
b770: 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
b780: 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  is.    ** large 
b790: 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
b7a0: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
b7b0: 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a  region)..    */.
b7c0: 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
b7d0: 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
b7e0: 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
b7f0: 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20  hFile, &sz);.   
b800: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b810: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
b820: 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
b830: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
b840: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
b850: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
b860: 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
b870: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
b880: 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
b890: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
b8a0: 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
b8b0: 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
b8c0: 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
b8d0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
b8e0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
b8f0: 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
b900: 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
b910: 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
b920: 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
b930: 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
b940: 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
b950: 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
b960: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
b970: 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
b980: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
b990: 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
b9a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
b9b0: 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
b9c0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
b9d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b9e0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
b9f0: 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
ba00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
ba10: 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
ba20: 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
ba30: 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
ba40: 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
ba50: 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
ba60: 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53  pNew = (struct S
ba70: 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74  hmRegion *)sqlit
ba80: 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20  e3_realloc(.    
ba90: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
baa0: 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b  egion, (iRegion+
bab0: 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b  1)*sizeof(apNew[
bac0: 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  0]).    );.    i
bad0: 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20  f( !apNew ){.   
bae0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
baf0: 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
bb00: 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
bb10: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
bb20: 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20  hmNode->aRegion 
bb30: 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68  = apNew;..    wh
bb40: 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
bb50: 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
bb60: 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
bb70: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
bb80: 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
bb90: 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
bba0: 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
bbb0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
bbc0: 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
bbd0: 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20  y region */.    
bbe0: 20 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 43   .      hMap = C
bbf0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
bc00: 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
bc10: 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
bc20: 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
bc30: 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
bc40: 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ULL.      );.   
bc50: 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20     if( hMap ){. 
bc60: 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 4d 61         pMap = Ma
bc70: 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70  pViewOfFile(hMap
bc80: 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
bc90: 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
bca0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
bcb0: 20 30 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20   0, nByte.      
bcc0: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
bcd0: 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a     if( !pMap ){.
bce0: 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
bcf0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
bd00: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
bd10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bd20: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
bd30: 20 69 66 28 20 68 4d 61 70 20 29 20 43 6c 6f 73   if( hMap ) Clos
bd40: 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
bd50: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
bd60: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
bd70: 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
bd80: 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
bd90: 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
bda0: 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
bdb0: 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
bdc0: 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
bdd0: 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
bde0: 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
bdf0: 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
be00: 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
be10: 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
be20: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
be30: 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
be40: 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
be50: 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
be60: 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
be70: 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
be80: 29 26 70 5b 69 52 65 67 69 6f 6e 2a 73 7a 52 65  )&p[iRegion*szRe
be90: 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
bea0: 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
beb0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
bec0: 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
bed0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
bee0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
bef0: 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
bf00: 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
bf10: 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
bf20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bf30: 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
bf40: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
bf50: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
bf60: 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
bf70: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
bf80: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
bf90: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
bfa0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
bfb0: 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
bfc0: 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
bfd0: 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
bfe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bff0: 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
c000: 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
c010: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
c040: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
c050: 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
c060: 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
c070: 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
c080: 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
c090: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
c0a0: 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
c0b0: 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
c0c0: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b  SQLITE_PROTOCOL;
c0d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
c0e0: 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
c0f0: 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
c100: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
c110: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
c120: 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
c130: 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
c140: 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
c150: 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
c160: 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
c170: 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
c180: 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
c190: 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
c1a0: 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
c1b0: 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
c1c0: 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
c1d0: 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
c1e0: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
c1f0: 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
c200: 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
c210: 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
c220: 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
c230: 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  0 );..  sqlite3_
c240: 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
c250: 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
c260: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
c270: 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
c280: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d  .    rc = winShm
c290: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
c2a0: 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
c2b0: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
c2c0: 53 45 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 20  SE, n);.  }else 
c2d0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
c2e0: 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
c2f0: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d  .    rc = winShm
c300: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
c310: 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  ode, _SHM_RDLCK,
c320: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
c330: 53 45 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  SE, n);.  }else{
c340: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d  .    rc = winShm
c350: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
c360: 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
c370: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
c380: 53 45 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 73 71  SE, n);.  }.  sq
c390: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
c3a0: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
c3b0: 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
c3c0: 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
c3d0: 64 2c 20 70 69 64 2d 25 64 20 25 73 5c 6e 22 2c  d, pid-%d %s\n",
c3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
c3f0: 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72 72 65  d, (int)GetCurre
c400: 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 72  ntProcessId(), r
c410: 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
c420: 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ok"));.  return 
c430: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
c440: 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
c450: 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
c460: 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
c470: 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
c480: 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
c490: 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
c4a0: 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
c4b0: 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
c4c0: 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
c4d0: 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
c4e0: 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
c4f0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
c500: 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
c510: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
c520: 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
c530: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
c540: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
c550: 72 79 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 4d 65  ry */.){.  /* Me
c560: 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f  moryBarrier(); /
c570: 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  / does not work 
c580: 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77  -- do not know w
c590: 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53  hy not */.  winS
c5a0: 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
c5b0: 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
c5c0: 65 78 28 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  ex();.}..#else.#
c5d0: 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4f 70   define winShmOp
c5e0: 65 6e 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  en    0.# define
c5f0: 20 77 69 6e 53 68 6d 53 69 7a 65 20 20 20 20 30   winShmSize    0
c600: 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
c610: 47 65 74 20 20 20 20 20 30 0a 23 20 64 65 66 69  Get     0.# defi
c620: 6e 65 20 77 69 6e 53 68 6d 52 65 6c 65 61 73 65  ne winShmRelease
c630: 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
c640: 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
c650: 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69  fine winShmBarri
c660: 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69  er 0.# define wi
c670: 6e 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a 23 65  nShmClose   0.#e
c680: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
c690: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
c6a0: 2a 2f 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./*.**********
c6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6c0: 2a 2a 2a 20 45 6e 64 20 53 68 61 72 65 64 20 4d  *** End Shared M
c6d0: 65 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  emory **********
c6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6f0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
c700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c740: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
c750: 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
c760: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
c770: 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
c780: 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
c790: 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
c7a0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
c7b0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
c7c0: 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
c7d0: 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  {.  2,          
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7f0: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
c800: 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 52 65  inClose,.  winRe
c810: 61 64 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a  ad,.  winWrite,.
c820: 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20    winTruncate,. 
c830: 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 46   winSync,.  winF
c840: 69 6c 65 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f  ileSize,.  winLo
c850: 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c  ck,.  winUnlock,
c860: 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
c870: 76 65 64 4c 6f 63 6b 2c 0a 20 20 77 69 6e 46 69  vedLock,.  winFi
c880: 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 77 69 6e  leControl,.  win
c890: 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 77 69  SectorSize,.  wi
c8a0: 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
c8b0: 69 73 74 69 63 73 2c 0a 20 20 77 69 6e 53 68 6d  istics,.  winShm
c8c0: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
c8d0: 20 20 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a     /* xShmOpen *
c8e0: 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c900: 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
c910: 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  nShmBarrier,    
c920: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
c930: 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
c940: 6d 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  mClose,         
c950: 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f 73 65      /* xShmClose
c960: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 20   */.  winShmMap 
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c980: 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 7d 3b 0a  * xShmMap */.};.
c990: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
c9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
c9e0: 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 49   Here ends the I
c9f0: 2f 4f 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  /O methods that 
ca00: 66 6f 72 6d 20 74 68 65 20 73 71 6c 69 74 65 33  form the sqlite3
ca10: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
ca20: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
ca30: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
ca40: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
ca50: 56 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a  VFS methods..***
ca60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
caa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
cab0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
cac0: 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
cad0: 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
cae0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
caf0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
cb00: 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
cb10: 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
cb20: 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
cb30: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
cb40: 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
cb50: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
cb60: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
cb70: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
cb80: 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55  c void *convertU
cb90: 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
cba0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
cbb0: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  e){.  void *zCon
cbc0: 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
cbd0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
cbe0: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
cbf0: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
cc00: 6e 61 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  name);./* isNT()
cc10: 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
cc20: 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
cc30: 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
cc40: 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f  er executed. .*/
cc50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
cc60: 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
cc70: 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
cc80: 3d 20 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69  = utf8ToMbcs(zFi
cc90: 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
cca0: 20 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20    }.  /* caller 
ccb0: 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
ccc0: 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
ccd0: 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
cce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
ccf0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
cd00: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
cd10: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
cd20: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
cd30: 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78  hold at pVfs->mx
cd40: 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74  Pathname charact
cd50: 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
cd60: 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69  nt getTempname(i
cd70: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
cd80: 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
cd90: 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
cda0: 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
cdb0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
cdc0: 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
cdd0: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
cde0: 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
cdf0: 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a  ";.  size_t i, j
ce00: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61  ;.  char zTempPa
ce10: 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a  th[MAX_PATH+1];.
ce20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
ce30: 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
ce40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ce50: 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
ce60: 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
ce70: 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
ce80: 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65  directory);.  }e
ce90: 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29  lse if( isNT() )
cea0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
ceb0: 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57  ti;.    WCHAR zW
cec0: 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48  idePath[MAX_PATH
ced0: 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61  ];.    GetTempPa
cee0: 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  thW(MAX_PATH-30,
cef0: 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20   zWidePath);.   
cf00: 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64   zMulti = unicod
cf10: 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74  eToUtf8(zWidePat
cf20: 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c  h);.    if( zMul
cf30: 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ti ){.      sqli
cf40: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
cf50: 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
cf60: 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74  ath, "%s", zMult
cf70: 69 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a  i);.      free(z
cf80: 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73  Multi);.    }els
cf90: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
cfa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cfb0: 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73    }./* isNT() is
cfc0: 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
cfd0: 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
cfe0: 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
cff0: 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
d000: 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
d010: 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
d020: 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
d030: 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
d040: 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
d050: 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
d060: 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
d070: 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
d080: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
d090: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
d0a0: 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b      char *zUtf8;
d0b0: 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50  .    char zMbcsP
d0c0: 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ath[MAX_PATH];. 
d0d0: 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 41 28     GetTempPathA(
d0e0: 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62  MAX_PATH-30, zMb
d0f0: 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74  csPath);.    zUt
d100: 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  f8 = sqlite3_win
d110: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
d120: 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
d130: 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20  if( zUtf8 ){.   
d140: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
d150: 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
d160: 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
d170: 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
d180: 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
d190: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
d1a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d1b0: 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  M;.    }.#endif.
d1c0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
d1d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
d1e0: 70 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a  pPath); i>0 && z
d1f0: 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27  TempPath[i-1]=='
d200: 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54  \\'; i--){}.  zT
d210: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a  empPath[i] = 0;.
d220: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
d230: 74 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66  tf(nBuf-30, zBuf
d240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d250: 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54       "%s\\"SQLIT
d260: 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
d270: 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a  IX, zTempPath);.
d280: 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
d290: 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73  len30(zBuf);.  s
d2a0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
d2b0: 73 28 32 30 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(20, &zBuf[j]);
d2c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30  .  for(i=0; i<20
d2d0: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
d2e0: 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
d2f0: 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
d300: 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
d310: 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
d320: 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42  )-1) ];.  }.  zB
d330: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 4f 53 54  uf[j] = 0;.  OST
d340: 52 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45  RACE(("TEMP FILE
d350: 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75  NAME: %s\n", zBu
d360: 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  f));.  return SQ
d370: 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a  LITE_OK; .}../*.
d380: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
d390: 6c 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72  lue of getLastEr
d3a0: 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72  rorMsg.** is zer
d3b0: 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
d3c0: 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
d3d0: 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
d3e0: 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
d3f0: 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
d400: 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
d410: 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
d420: 74 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  t getLastErrorMs
d430: 67 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  g(int nBuf, char
d440: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
d450: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
d460: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
d470: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
d480: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
d490: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
d4a0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
d4b0: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
d4c0: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
d4d0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
d4e0: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
d4f0: 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 47   DWORD error = G
d500: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
d510: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
d520: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
d530: 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28   0;..  if( isNT(
d540: 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a  ) ){.    WCHAR *
d550: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
d560: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 46 6f  ;.    dwLen = Fo
d570: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
d580: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
d590: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 20 46 4f  CATE_BUFFER | FO
d5a0: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
d5b0: 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52 4d 41  M_SYSTEM | FORMA
d5c0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
d5d0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 65 72 72 6f 72 2c 0a 20 20 20        error,.   
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
d660: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
d6b0: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
d6c0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
d6d0: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
d6e0: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
d6f0: 20 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63       zOut = unic
d700: 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57  odeToUtf8(zTempW
d710: 69 64 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  ide);.      /* f
d720: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
d730: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
d740: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
d750: 20 2a 2f 0a 20 20 20 20 20 20 4c 6f 63 61 6c 46   */.      LocalF
d760: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
d770: 20 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20      }./* isNT() 
d780: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
d790: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
d7a0: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
d7b0: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
d7c0: 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
d7d0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
d7e0: 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
d7f0: 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
d800: 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
d810: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
d820: 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
d830: 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
d840: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
d850: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
d860: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
d870: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  p = NULL;.    dw
d880: 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65 73 73  Len = FormatMess
d890: 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageA(FORMAT_MESS
d8a0: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
d8b0: 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53  FER | FORMAT_MES
d8c0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
d8d0: 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47   | FORMAT_MESSAG
d8e0: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
d8f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
d910: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72                er
d930: 72 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ror,.           
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
d970: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d990: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
d9c0: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
d9d0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
d9e0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
d9f0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
da00: 2f 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73  /.      zOut = s
da10: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
da20: 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29  s_to_utf8(zTemp)
da30: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
da40: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
da50: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
da60: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
da70: 20 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28        LocalFree(
da80: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 23 65  zTemp);.    }.#e
da90: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 30  ndif.  }.  if( 0
daa0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
dab0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
dac0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
dad0: 73 45 72 72 6f 72 20 30 78 25 78 20 28 25 75 29  sError 0x%x (%u)
dae0: 22 2c 20 65 72 72 6f 72 2c 20 65 72 72 6f 72 29  ", error, error)
daf0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
db00: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
db10: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
db20: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
db30: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
db40: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
db50: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
db60: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
db70: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
db80: 20 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a      free(zOut);.
db90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
dba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
dbb0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
dbc0: 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
dbd0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
dbe0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ,        /* Not 
dbf0: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
dc00: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
dc10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
dc20: 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
dc30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
dc40: 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
dc50: 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69  * Write the SQLi
dc60: 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68  te file handle h
dc70: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
dc80: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
dc90: 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20     /* Open mode 
dca0: 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  flags */.  int *
dcb0: 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
dcc0: 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72       /* Status r
dcd0: 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29  eturn flags */.)
dce0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
dcf0: 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
dd00: 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
dd10: 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
dd20: 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
dd30: 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
dd40: 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
dd50: 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
dd60: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
dd70: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
dd80: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
dd90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
dda0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
ddb0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ddd0: 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
dde0: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
ddf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
de00: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 20 20  Name = zName;   
de10: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
de20: 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a  UTF-8 encoding *
de30: 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
de40: 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 20  e[MAX_PATH+1];  
de50: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
de60: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74  used to create t
de70: 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  emp filename */.
de80: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
de90: 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
dea0: 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
deb0: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41   pFile->h = INVA
dec0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
ded0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
dee0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
def0: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
df00: 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
df10: 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  e a .  ** tempor
df20: 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ary file name to
df30: 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28   use .  */.  if(
df40: 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
df50: 20 20 20 69 6e 74 20 72 63 20 3d 20 67 65 74 54     int rc = getT
df60: 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48  empname(MAX_PATH
df70: 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  +1, zTmpname);. 
df80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
df90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
dfa0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
dfb0: 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a     zUtf8Name = z
dfc0: 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20  Tmpname;.  }..  
dfd0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66  /* Convert the f
dfe0: 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73  ilename to the s
dff0: 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20  ystem encoding. 
e000: 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  */.  zConverted 
e010: 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
e020: 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29  ename(zUtf8Name)
e030: 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
e040: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
e050: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e060: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61  ;.  }..  if( fla
e070: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e080: 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20  _READWRITE ){.  
e090: 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
e0a0: 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
e0b0: 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45   | GENERIC_WRITE
e0c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
e0d0: 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d  wDesiredAccess =
e0e0: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20   GENERIC_READ;. 
e0f0: 20 7d 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f   }.  /* SQLITE_O
e100: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
e110: 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
e120: 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
e130: 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61  le is .  ** crea
e140: 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
e150: 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
e160: 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
e170: 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20  e access" .  ** 
e180: 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79  as it is usually
e190: 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a   understood..  *
e1a0: 2f 0a 20 20 61 73 73 65 72 74 28 21 28 66 6c 61  /.  assert(!(fla
e1b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e1c0: 5f 45 58 43 4c 55 53 49 56 45 29 20 7c 7c 20 28  _EXCLUSIVE) || (
e1d0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
e1e0: 50 45 4e 5f 43 52 45 41 54 45 29 29 3b 0a 20 20  PEN_CREATE));.  
e1f0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
e200: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
e210: 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  E ){.    /* Crea
e220: 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
e230: 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
e240: 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
e250: 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
e260: 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
e270: 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
e280: 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
e290: 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
e2a0: 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
e2b0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
e2c0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 29 7b 0a  _OPEN_CREATE ){.
e2d0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73      /* Open exis
e2e0: 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72  ting file, or cr
e2f0: 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e  eate if it doesn
e300: 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20  't exist */.    
e310: 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
e320: 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
e330: 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AYS;.  }else{.  
e340: 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c    /* Opens a fil
e350: 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78  e, only if it ex
e360: 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ists. */.    dwC
e370: 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
e380: 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49  on = OPEN_EXISTI
e390: 4e 47 3b 0a 20 20 7d 0a 20 20 64 77 53 68 61 72  NG;.  }.  dwShar
e3a0: 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
e3b0: 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
e3c0: 48 41 52 45 5f 57 52 49 54 45 3b 0a 20 20 69 66  HARE_WRITE;.  if
e3d0: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
e3e0: 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
e3f0: 4f 53 45 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  OSE ){.#if SQLIT
e400: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
e410: 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
e420: 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
e430: 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
e440: 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
e450: 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
e460: 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
e470: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
e480: 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
e4b0: 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
e4e0: 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
e4f0: 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
e500: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
e510: 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
e520: 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
e530: 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
e540: 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
e550: 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
e560: 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
e570: 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
e580: 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
e590: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
e5a0: 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
e5b0: 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
e5c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e5d0: 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
e5e0: 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
e5f0: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
e600: 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 20 20  CCESS;.#endif.  
e610: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
e620: 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65    h = CreateFile
e630: 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
e640: 72 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44  rted,.       dwD
e650: 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
e660: 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
e670: 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20  ,.       NULL,. 
e680: 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
e690: 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
e6a0: 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
e6b0: 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
e6c0: 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a 20   NULL.    );./* 
e6d0: 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
e6e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
e6f0: 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
e700: 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
e710: 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
e720: 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
e730: 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
e740: 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
e750: 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
e760: 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
e770: 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
e780: 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
e790: 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
e7a0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
e7b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d    }else{.    h =
e7c0: 20 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68   CreateFileA((ch
e7d0: 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  ar*)zConverted,.
e7e0: 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
e7f0: 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64  Access,.       d
e800: 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20  wShareMode,.    
e810: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
e820: 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
e830: 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77  ition,.       dw
e840: 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
e850: 65 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  es,.       NULL.
e860: 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
e870: 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  }.  OSTRACE(("OP
e880: 45 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25  EN %d %s 0x%lx %
e890: 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
e8a0: 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65    h, zName, dwDe
e8b0: 73 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20  siredAccess, .  
e8c0: 20 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41           h==INVA
e8d0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
e8e0: 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
e8f0: 6b 22 29 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49  k"));.  if( h==I
e900: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
e910: 4c 55 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28  LUE ){.    free(
e920: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
e930: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
e940: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
e950: 54 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  TE ){.      retu
e960: 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
e970: 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20   zName, id, .   
e980: 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
e990: 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
e9a0: 41 44 4f 4e 4c 59 29 26 7e 53 51 4c 49 54 45 5f  ADONLY)&~SQLITE_
e9b0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 2c  OPEN_READWRITE),
e9c0: 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
e9d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
e9e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
e9f0: 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
ea00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 46  .  }.  if( pOutF
ea10: 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20  lags ){.    if( 
ea20: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
ea30: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b  PEN_READWRITE ){
ea40: 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
ea50: 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
ea60: 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
ea70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
ea80: 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
ea90: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
eaa0: 20 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65     }.  }.  memse
eab0: 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
eac0: 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20 70  of(*pFile));.  p
ead0: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
eae0: 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  &winIoMethod;.  
eaf0: 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20  pFile->h = h;.  
eb00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
eb10: 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70   = NO_ERROR;.  p
eb20: 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66  File->pVfs = pVf
eb30: 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68 6d  s;.  pFile->pShm
eb40: 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a   = 0;.  pFile->z
eb50: 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Path = zName;.  
eb60: 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
eb70: 65 20 3d 20 67 65 74 53 65 63 74 6f 72 53 69 7a  e = getSectorSiz
eb80: 65 28 70 56 66 73 2c 20 7a 55 74 66 38 4e 61 6d  e(pVfs, zUtf8Nam
eb90: 65 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  e);.#if SQLITE_O
eba0: 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 28 66  S_WINCE.  if( (f
ebb0: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
ebc0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
ebd0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
ebe0: 42 29 29 20 3d 3d 0a 20 20 20 20 20 20 20 20 20  B)) ==.         
ebf0: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
ec00: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
ec10: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
ec20: 29 0a 20 20 20 20 20 20 20 26 26 20 21 77 69 6e  ).       && !win
ec30: 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
ec40: 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a  me, pFile).  ){.
ec50: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
ec60: 68 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f  h);.    free(zCo
ec70: 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65  nverted);.    re
ec80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
ec90: 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OPEN_BKPT;.  }. 
eca0: 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
ecb0: 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74     pFile->zDelet
ecc0: 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76  eOnClose = zConv
ecd0: 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23  erted;.  }else.#
ece0: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 66 72  endif.  {.    fr
ecf0: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
ed00: 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65    }.  OpenCounte
ed10: 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
ed20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ed30: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
ed40: 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
ed50: 20 4e 6f 74 65 20 74 68 61 74 20 77 69 6e 64 6f   Note that windo
ed60: 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
ed70: 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
ed80: 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
ed90: 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
eda0: 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
edb0: 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
edc0: 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
edd0: 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
ede0: 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
edf0: 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
ee00: 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
ee10: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
ee20: 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
ee30: 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
ee40: 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
ee50: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
ee60: 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
ee70: 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
ee80: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
ee90: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
eea0: 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
eeb0: 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
eec0: 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
eed0: 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
eee0: 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
eef0: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
ef00: 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
ef10: 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
ef20: 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
ef30: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
ef40: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
ef50: 6e 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  ne MX_DELETION_A
ef60: 54 54 45 4d 50 54 53 20 35 0a 73 74 61 74 69 63  TTEMPTS 5.static
ef70: 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a   int winDelete(.
ef80: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
ef90: 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs,          /*
efa0: 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
efb0: 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
efc0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
efd0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
efe0: 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ile to delete */
eff0: 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20  .  int syncDir  
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f010: 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
f020: 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n32 */.){.  int 
f030: 63 6e 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44  cnt = 0;.  DWORD
f040: 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 65 72 72   rc;.  DWORD err
f050: 6f 72 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  or = 0;.  void *
f060: 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
f070: 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
f080: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55  (zFilename);.  U
f090: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f0a0: 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
f0b0: 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
f0c0: 72 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  r);.  if( zConve
f0d0: 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
f0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
f0f0: 45 4d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61  EM;.  }.  Simula
f100: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
f110: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
f120: 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 69 73 4e  LETE);.  if( isN
f130: 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20  T() ){.    do{. 
f140: 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57       DeleteFileW
f150: 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
f160: 20 20 7d 77 68 69 6c 65 28 20 20 20 28 20 20 20    }while(   (   
f170: 28 28 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74  ((rc = GetFileAt
f180: 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
f190: 72 74 65 64 29 29 20 21 3d 20 49 4e 56 41 4c 49  rted)) != INVALI
f1a0: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
f1b0: 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S).             
f1c0: 20 20 7c 7c 20 28 28 65 72 72 6f 72 20 3d 20 47    || ((error = G
f1d0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20 3d  etLastError()) =
f1e0: 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44  = ERROR_ACCESS_D
f1f0: 45 4e 49 45 44 29 29 0a 20 20 20 20 20 20 20 20  ENIED)).        
f200: 20 20 20 26 26 20 28 2b 2b 63 6e 74 20 3c 20 4d     && (++cnt < M
f210: 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
f220: 50 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  PTS).           
f230: 26 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20  && (Sleep(100), 
f240: 31 29 20 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  1) );./* isNT() 
f250: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
f260: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
f270: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
f280: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
f290: 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
f2a0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
f2b0: 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
f2c0: 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
f2d0: 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
f2e0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
f2f0: 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
f300: 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
f310: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
f320: 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
f330: 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  {.    do{.      
f340: 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e  DeleteFileA(zCon
f350: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68  verted);.    }wh
f360: 69 6c 65 28 20 20 20 28 20 20 20 28 28 72 63 20  ile(   (   ((rc 
f370: 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
f380: 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
f390: 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  ) != INVALID_FIL
f3a0: 45 5f 41 54 54 52 49 42 55 54 45 53 29 0a 20 20  E_ATTRIBUTES).  
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
f3c0: 28 28 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73  ((error = GetLas
f3d0: 74 45 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52  tError()) == ERR
f3e0: 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
f3f0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  )).           &&
f400: 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c   (++cnt < MX_DEL
f410: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a  ETION_ATTEMPTS).
f420: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 53             && (S
f430: 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
f440: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72  .#endif.  }.  fr
f450: 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
f460: 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
f470: 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c  TE \"%s\" %s\n",
f480: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
f490: 20 20 20 28 20 28 72 63 3d 3d 49 4e 56 41 4c 49     ( (rc==INVALI
f4a0: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
f4b0: 53 29 20 26 26 20 28 65 72 72 6f 72 3d 3d 45 52  S) && (error==ER
f4c0: 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
f4d0: 4e 44 29 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ND)) ?.         
f4e0: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 20  "ok" : "failed" 
f4f0: 29 29 3b 0a 20 0a 20 20 72 65 74 75 72 6e 20 28  ));. .  return (
f500: 20 20 20 28 72 63 20 3d 3d 20 49 4e 56 41 4c 49     (rc == INVALI
f510: 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
f520: 53 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  S) .          &&
f530: 20 28 65 72 72 6f 72 20 3d 3d 20 45 52 52 4f 52   (error == ERROR
f540: 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29  _FILE_NOT_FOUND)
f550: 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  ) ? SQLITE_OK : 
f560: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
f570: 45 54 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ETE;.}../*.** Ch
f580: 65 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63  eck the existanc
f590: 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20  e and status of 
f5a0: 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
f5b0: 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28  c int winAccess(
f5c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
f5d0: 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  pVfs,         /*
f5e0: 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
f5f0: 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
f600: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
f610: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
f620: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
f630: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
f640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f650: 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d  ype of test to m
f660: 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ake on this file
f670: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
f680: 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
f690: 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20   /* OUT: Result 
f6a0: 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  */.){.  DWORD at
f6b0: 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
f6c0: 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
f6d0: 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
f6e0: 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
f6f0: 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
f700: 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
f710: 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
f720: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
f730: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
f740: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
f750: 29 20 29 7b 0a 20 20 20 20 61 74 74 72 20 3d 20  ) ){.    attr = 
f760: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
f770: 73 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  sW((WCHAR*)zConv
f780: 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28  erted);./* isNT(
f790: 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
f7a0: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
f7b0: 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
f7c0: 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
f7d0: 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
f7e0: 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
f7f0: 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
f800: 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
f810: 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
f820: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
f830: 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
f840: 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
f850: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
f860: 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
f870: 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47  se{.    attr = G
f880: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
f890: 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
f8a0: 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
f8b0: 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  .  free(zConvert
f8c0: 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ed);.  switch( f
f8d0: 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
f8e0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
f8f0: 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51  EAD:.    case SQ
f900: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
f910: 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TS:.      rc = a
f920: 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
f930: 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
f940: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f950: 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
f960: 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
f970: 20 20 20 72 63 20 3d 20 28 61 74 74 72 20 26 20     rc = (attr & 
f980: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
f990: 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
f9a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
f9b0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
f9c0: 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
f9d0: 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
f9e0: 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
f9f0: 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
fa00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
fa10: 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
fa20: 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
fa30: 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
fa40: 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c  .  Write the ful
fa50: 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e  l.** pathname in
fa60: 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74  to zOut[].  zOut
fa70: 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65  [] will be at le
fa80: 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ast pVfs->mxPath
fa90: 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e  name.** bytes in
faa0: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
fab0: 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68   int winFullPath
fac0: 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
fad0: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
fae0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
faf0: 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
fb00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fb10: 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20  zRelative,      
fb20: 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65    /* Possibly re
fb30: 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74  lative input pat
fb40: 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  h */.  int nFull
fb50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fb60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
fb70: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e  output buffer in
fb80: 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72   bytes */.  char
fb90: 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20   *zFull         
fba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
fbb0: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
fbc0: 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .  .#if defined(
fbd0: 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 55 4e  __CYGWIN__).  UN
fbe0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
fbf0: 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f  Full);.  cygwin_
fc00: 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
fc10: 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76  32_path(zRelativ
fc20: 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74  e, zFull);.  ret
fc30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
fc40: 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
fc50: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55  E_OS_WINCE.  UNU
fc60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
fc70: 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  ull);.  /* WinCE
fc80: 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
fc90: 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
fca0: 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
fcb0: 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71  am told. */.  sq
fcc0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70  lite3_snprintf(p
fcd0: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
fce0: 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
fcf0: 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75  elative);.  retu
fd00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
fd10: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
fd20: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
fd30: 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
fd40: 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  _).  int nByte;.
fd50: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
fd60: 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ed;.  char *zOut
fd70: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
fd80: 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a  ETER(nFull);.  z
fd90: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
fda0: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
fdb0: 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
fdc0: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
fdd0: 57 43 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20  WCHAR *zTemp;.  
fde0: 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
fdf0: 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
fe00: 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  R*)zConverted, 0
fe10: 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
fe20: 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28   zTemp = malloc(
fe30: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
fe40: 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
fe50: 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
fe60: 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65       free(zConve
fe70: 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
fe80: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
fe90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46  ;.    }.    GetF
fea0: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43  ullPathNameW((WC
feb0: 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
fec0: 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
fed0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  );.    free(zCon
fee0: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
fef0: 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  t = unicodeToUtf
ff00: 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
ff10: 65 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20 69 73  ee(zTemp);./* is
ff20: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
ff30: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
ff40: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
ff50: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
ff60: 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
ff70: 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
ff80: 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
ff90: 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
ffa0: 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
ffb0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
ffc0: 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
ffd0: 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
ffe0: 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
fff0: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
10000 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
10010 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
10020 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
10030 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
10040 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
10050 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
10060 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  = malloc( nByte*
10070 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
10080 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
10090 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  p==0 ){.      fr
100a0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
100b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
100c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
100d0 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68  .    GetFullPath
100e0 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
100f0 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
10100 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66  zTemp, 0);.    f
10110 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
10120 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
10130 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
10140 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
10150 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a     free(zTemp);.
10160 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
10170 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
10180 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
10190 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
101a0 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
101b0 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75  t);.    free(zOu
101c0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
101d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
101e0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
101f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
10200 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
10210 47 65 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  Get the sector s
10220 69 7a 65 20 6f 66 20 74 68 65 20 64 65 76 69 63  ize of the devic
10230 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
10240 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
10250 69 63 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72  ic int getSector
10260 53 69 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65  Size(.    sqlite
10270 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20  3_vfs *pVfs,.   
10280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
10290 6c 61 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54  lative     /* UT
102a0 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  F-8 file name */
102b0 0a 29 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65  .){.  DWORD byte
102c0 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c  sPerSector = SQL
102d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
102e0 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65  OR_SIZE;.  /* Ge
102f0 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 20 69  tDiskFreeSpace i
10300 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
10310 75 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23  under WINCE */.#
10320 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
10330 43 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  CE.  UNUSED_PARA
10340 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
10350 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10360 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73  zRelative);.#els
10370 65 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61  e.  char zFullpa
10380 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a  th[MAX_PATH+1];.
10390 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
103a0 44 20 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44  D dwRet = 0;.  D
103b0 57 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20  WORD dwDummy;.. 
103c0 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64   /*.  ** We need
103d0 20 74 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c   to get the full
103e0 20 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68   path name of th
103f0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67  e file.  ** to g
10400 65 74 20 74 68 65 20 64 72 69 76 65 20 6c 65 74  et the drive let
10410 74 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74  ter to look up t
10420 68 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73  he sector.  ** s
10430 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ize..  */.  rc =
10440 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
10450 28 70 56 66 73 2c 20 7a 52 65 6c 61 74 69 76 65  (pVfs, zRelative
10460 2c 20 4d 41 58 5f 50 41 54 48 2c 20 7a 46 75 6c  , MAX_PATH, zFul
10470 6c 70 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63  lpath);.  if( rc
10480 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 0a   == SQLITE_OK ).
10490 20 20 7b 0a 20 20 20 20 76 6f 69 64 20 2a 7a 43    {.    void *zC
104a0 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
104b0 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
104c0 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20 20 20 69  Fullpath);.    i
104d0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b  f( zConverted ){
104e0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4e 54 28  .      if( isNT(
104f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
10500 74 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73  trim path to jus
10510 74 20 64 72 69 76 65 20 72 65 66 65 72 65 6e 63  t drive referenc
10520 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 57 43 48  e */.        WCH
10530 41 52 20 2a 70 20 3d 20 7a 43 6f 6e 76 65 72 74  AR *p = zConvert
10540 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ed;.        for(
10550 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ;*p;p++){.      
10560 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c      if( *p == '\
10570 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  \' ){.          
10580 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20    *p = '\0';.   
10590 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
105a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
105b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77      }.        dw
105c0 52 65 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65  Ret = GetDiskFre
105d0 65 53 70 61 63 65 57 28 28 57 43 48 41 52 2a 29  eSpaceW((WCHAR*)
105e0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
10610 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20  wDummy,.        
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 20 26 62 79 74 65 73            &bytes
10640 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20  PerSector,.     
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77               &dw
10670 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20  Dummy,.         
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
106a0 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  y);.      }else{
106b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d  .        /* trim
106c0 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72   path to just dr
106d0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ive reference */
106e0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
106f0 20 3d 20 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76   = (char *)zConv
10700 65 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66  erted;.        f
10710 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20  or(;*p;p++){.   
10720 20 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d         if( *p ==
10730 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20   '\\' ){.       
10740 20 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a       *p = '\0';.
10750 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
10760 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
10770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10780 20 64 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b   dwRet = GetDisk
10790 46 72 65 65 53 70 61 63 65 41 28 28 63 68 61 72  FreeSpaceA((char
107a0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20  &dwDummy,.      
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79 74              &byt
10800 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20  esPerSector,.   
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
10830 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20  dwDummy,.       
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
10860 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mmy);.      }.  
10870 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
10880 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ted);.    }.    
10890 69 66 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20  if( !dwRet ){.  
108a0 20 20 20 20 62 79 74 65 73 50 65 72 53 65 63 74      bytesPerSect
108b0 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  or = SQLITE_DEFA
108c0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
108d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
108e0 66 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  f.  return (int)
108f0 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 3b   bytesPerSector;
10900 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   .}..#ifndef SQL
10910 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
10920 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
10930 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
10940 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
10950 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
10960 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
10970 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
10980 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
10990 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
109a0 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a   library..*/./*.
109b0 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
109c0 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
109d0 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
109e0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
109f0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
10a00 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
10a10 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
10a20 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
10a30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
10a40 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
10a50 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
10a60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
10a70 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
10a80 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
10a90 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
10aa0 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
10ab0 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me);.  UNUSED_PA
10ac0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
10ad0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
10ae0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10af0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   0;.  }.  if( is
10b00 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20  NT() ){.    h = 
10b10 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 57 43  LoadLibraryW((WC
10b20 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  HAR*)zConverted)
10b30 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
10b40 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
10b50 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
10b60 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
10b70 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
10b80 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
10b90 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
10ba0 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
10bb0 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
10bc0 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
10bd0 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
10be0 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
10bf0 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
10c00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10c10 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
10c20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72    h = LoadLibrar
10c30 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
10c40 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
10c50 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72  }.  free(zConver
10c60 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ted);.  return (
10c70 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69  void*)h;.}.stati
10c80 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f  c void winDlErro
10c90 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
10ca0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
10cb0 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
10cc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10cd0 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61  R(pVfs);.  getLa
10ce0 73 74 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c  stErrorMsg(nBuf,
10cf0 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 76 6f 69   zBufOut);.}.voi
10d00 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
10d10 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
10d20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63  void *pHandle, c
10d30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62  onst char *zSymb
10d40 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e  ol))(void){.  UN
10d50 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
10d60 56 66 73 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  Vfs);.#if SQLITE
10d70 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54  _OS_WINCE.  /* T
10d80 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 73  he GetProcAddres
10d90 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  sA() routine is 
10da0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
10db0 6e 20 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65  n wince. */.  re
10dc0 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
10dd0 69 64 29 29 47 65 74 50 72 6f 63 41 64 64 72 65  id))GetProcAddre
10de0 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ssA((HANDLE)pHan
10df0 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23  dle, zSymbol);.#
10e00 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74  else.  /* All ot
10e10 68 65 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74  her windows plat
10e20 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74  forms expect Get
10e30 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f  ProcAddress() to
10e40 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e   take.  ** an An
10e50 73 69 20 73 74 72 69 6e 67 20 72 65 67 61 72 64  si string regard
10e60 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49  less of the _UNI
10e70 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a  CODE setting */.
10e80 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a    return (void(*
10e90 29 28 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41  )(void))GetProcA
10ea0 64 64 72 65 73 73 28 28 48 41 4e 44 4c 45 29 70  ddress((HANDLE)p
10eb0 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
10ec0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20  ;.#endif.}.void 
10ed0 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
10ee0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
10ef0 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
10f00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10f10 28 70 56 66 73 29 3b 0a 20 20 46 72 65 65 4c 69  (pVfs);.  FreeLi
10f20 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48  brary((HANDLE)pH
10f30 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
10f40 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
10f50 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
10f60 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
10f70 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
10f80 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
10f90 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
10fa0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
10fb0 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
10fc0 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
10fd0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
10fe0 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
10ff0 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
11000 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
11010 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
11020 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
11030 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
11040 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
11050 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
11060 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11070 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
11080 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
11090 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
110a0 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
110b0 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
110c0 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
110d0 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
110e0 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
110f0 3b 0a 20 20 20 20 47 65 74 53 79 73 74 65 6d 54  ;.    GetSystemT
11100 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
11110 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
11120 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
11130 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
11140 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
11150 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
11160 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
11170 69 64 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50  id = GetCurrentP
11180 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20  rocessId();.    
11190 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
111a0 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69   &pid, sizeof(pi
111b0 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  d));.    n += si
111c0 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20  zeof(pid);.  }. 
111d0 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52   if( sizeof(DWOR
111e0 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
111f0 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 47 65    DWORD cnt = Ge
11200 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20  tTickCount();.  
11210 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
11220 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
11230 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
11240 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
11250 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41  .  if( sizeof(LA
11260 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42  RGE_INTEGER)<=nB
11270 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47  uf-n ){.    LARG
11280 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20  E_INTEGER i;.   
11290 20 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63   QueryPerformanc
112a0 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20  eCounter(&i);.  
112b0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
112c0 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29  ], &i, sizeof(i)
112d0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
112e0 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  of(i);.  }.#endi
112f0 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  f.  return n;.}.
11300 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
11310 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
11320 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
11330 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
11340 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
11350 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
11360 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
11370 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53  t microsec){.  S
11380 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
11390 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55  99)/1000);.  UNU
113a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
113b0 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fs);.  return ((
113c0 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
113d0 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
113e0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
113f0 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
11400 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
11410 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
11420 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
11430 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
11440 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
11450 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
11460 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
11470 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
11480 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
11490 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
114a0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
114b0 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
114c0 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
114d0 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
114e0 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
114f0 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
11500 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
11510 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
11520 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
11530 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
11540 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
11550 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
11560 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
11570 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
11580 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
11590 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
115a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
115b0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
115c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
115d0 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
115e0 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
115f0 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
11600 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
11610 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
11620 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
11630 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
11640 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
11650 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
11660 63 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20  cess, return 0. 
11670 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
11680 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
11690 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
116a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
116b0 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
116c0 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  4(sqlite3_vfs *p
116d0 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Vfs, sqlite3_int
116e0 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a  64 *piNow){.  /*
116f0 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
11700 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20  ure is a 64-bit 
11710 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69  value representi
11720 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
11730 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73   .     100-nanos
11740 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20  econd intervals 
11750 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c  since January 1,
11760 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35   1601 (= JD 2305
11770 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20  813.5). .  */.  
11780 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
11790 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
117a0 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
117b0 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
117c0 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
117d0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
117e0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
117f0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
11800 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
11810 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
11820 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
11830 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
11840 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
11850 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
11860 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
11870 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
11880 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
11890 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
118a0 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c  ue = .      (sql
118b0 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
118c0 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33  00000 + (sqlite3
118d0 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
118e0 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
118f0 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
11900 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
11910 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
11920 74 69 6d 65 3b 0a 20 20 47 65 74 53 79 73 74 65  time;.  GetSyste
11930 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
11940 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65  /* if SystemTime
11950 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69  ToFileTime() fai
11960 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a  ls, it returns z
11970 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 53  ero. */.  if (!S
11980 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
11990 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b  ime(&time,&ft)){
119a0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
119b0 20 7d 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79   }.#else.  GetSy
119c0 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
119d0 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69  me( &ft );.#endi
119e0 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69  f..  *piNow = wi
119f0 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b  nFiletimeEpoch +
11a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28  .            (((
11a10 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
11a20 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  t.dwHighDateTime
11a30 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29  )*max32BitValue)
11a40 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
11a50 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
11a60 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
11a70 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
11a80 36 34 29 31 30 30 30 3b 0a 0a 23 69 66 64 65 66  64)1000;..#ifdef
11a90 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
11aa0 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
11ab0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
11ac0 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
11ad0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
11ae0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
11af0 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
11b00 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
11b10 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
11b20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
11b30 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
11b40 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
11b50 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
11b60 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
11b70 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
11b80 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
11b90 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
11ba0 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
11bb0 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
11bc0 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
11bd0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
11be0 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
11bf0 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69  found..*/.int wi
11c00 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
11c10 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
11c20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
11c30 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
11c40 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
11c50 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
11c60 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
11c70 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
11c80 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
11c90 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
11ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11cb0 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
11cc0 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
11cd0 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
11ce0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
11cf0 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
11d00 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
11d10 61 67 65 28 29 20 6f 6e 20 77 69 6e 64 6f 77 73  age() on windows
11d20 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
11d30 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
11d40 6e 20 75 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n unix). After a
11d50 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
11d60 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
11d70 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
11d80 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
11d90 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
11da0 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
11db0 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
11dc0 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
11dd0 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
11de0 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
11df0 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
11e00 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
11e10 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
11e20 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
11e30 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
11e40 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
11e50 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
11e60 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
11e70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
11e80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
11e90 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
11ea0 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
11eb0 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
11ec0 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
11ed0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
11ee0 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
11ef0 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
11f00 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
11f10 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
11f20 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
11f30 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
11f40 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
11f50 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
11f60 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
11f70 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
11f80 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
11f90 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
11fa0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
11fb0 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
11fc0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
11fd0 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
11fe0 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
11ff0 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
12000 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
12010 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
12020 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
12030 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
12040 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
12050 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
12060 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
12070 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
12080 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
12090 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
120a0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
120b0 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
120c0 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
120d0 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
120e0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
120f0 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
12100 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
12110 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
12120 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
12130 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
12140 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
12150 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
12160 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
12170 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
12180 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
12190 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
121a0 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
121b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
121c0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
121d0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
121e0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
121f0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
12200 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
12210 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61  ;.  return getLa
12220 73 74 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c  stErrorMsg(nBuf,
12230 20 7a 42 75 66 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a   zBuf);.}..../*.
12240 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
12250 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
12260 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
12270 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
12280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
12290 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
122a0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
122b0 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
122c0 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
122d0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
122e0 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
122f0 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
12300 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
12310 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20   MAX_PATH,      
12320 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
12330 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
12360 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20  "win32",        
12370 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
12380 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
12390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
123a0 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
123b0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
123c0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
123d0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
123e0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
123f0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
12400 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
12410 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
12420 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
12430 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
12440 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
12450 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
12460 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
12470 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
12480 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
12490 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
124a0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
124b0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
124c0 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
124d0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
124e0 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
124f0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
12500 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
12510 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
12520 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
12530 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
12540 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
12550 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
12560 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
12570 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
12580 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
12590 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
125a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
125b0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ame */.    winCu
125c0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
125d0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
125e0 6e 74 36 34 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20  nt64 */.  };..  
125f0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
12600 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
12610 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12620 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c  E_OK; .}.int sql
12630 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
12640 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
12650 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
12660 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
12670 49 4e 20 2a 2f 0a                                IN */.