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

Artifact 81dd8f5434b3b73b1f1567a784811601b6437ce3:


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 73  is object */.  s
8b00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
8b10: 74 65 78 42 75 66 3b 20 20 20 2f 2a 20 4d 75 74  texBuf;   /* Mut
8b20: 65 78 20 74 6f 20 61 63 63 65 73 73 20 7a 42 75  ex to access zBu
8b30: 66 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  f[] */.  char *z
8b40: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8b50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8b60: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  he file */.  win
8b70: 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20  File hFile;     
8b80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8b90: 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f  handle from winO
8ba0: 70 65 6e 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  pen */.  HANDLE 
8bb0: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
8bc0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
8bd0: 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
8be0: 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 44  leMapping */.  D
8bf0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
8c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8c10: 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
8c20: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
8c30: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
8c40: 73 7a 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20  szMap;          
8c50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8c60: 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6f 66  f the mapping of
8c70: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
8c80: 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 4d 4d  y */.  char *pMM
8c90: 61 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  apBuf;          
8ca0: 20 20 2f 2a 20 57 68 65 72 65 20 63 75 72 72 65    /* Where curre
8cb0: 6e 74 6c 79 20 6d 6d 61 70 70 65 64 28 29 2e 20  ntly mmapped(). 
8cc0: 20 4e 55 4c 4c 20 69 66 20 75 6e 6d 61 70 70 65   NULL if unmappe
8cd0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  d */.  int nRef;
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
8d00: 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
8d10: 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
8d20: 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72  /.  winShm *pFir
8d30: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
8d40: 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a  * All winShm obj
8d50: 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
8d60: 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
8d70: 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20  mNode *pNext;   
8d80: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e        /* Next in
8d90: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e   list of all win
8da0: 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20  ShmNode objects 
8db0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8dc0: 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c  _DEBUG.  u8 excl
8dd0: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
8de0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
8df0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
8e00: 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72  eld */.  u8 shar
8e10: 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
8e20: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
8e30: 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
8e40: 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d   */.  u8 nextShm
8e50: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
8e60: 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
8e70: 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
8e80: 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
8e90: 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
8ea0: 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
8eb0: 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
8ec0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
8ed0: 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
8ee0: 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
8ef0: 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
8f00: 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
8f10: 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
8f20: 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
8f30: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
8f40: 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
8f50: 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
8f60: 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
8f70: 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
8f80: 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
8f90: 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
8fa0: 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 46  .**.** winShm.pF
8fb0: 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ile->mutex must 
8fc0: 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65  be held while re
8fd0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
8fe0: 20 74 68 65 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70   the.** winShm.p
8ff0: 4e 65 78 74 20 61 6e 64 20 77 69 6e 53 68 6d 2e  Next and winShm.
9000: 6c 6f 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e 74 73  locks[] elements
9010: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
9020: 68 6d 2e 70 46 69 6c 65 20 65 6c 65 6d 65 6e 74  hm.pFile element
9030: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
9040: 77 68 65 6e 20 74 68 65 20 6f 62 6a 65 63 74 20  when the object 
9050: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
9060: 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 74  d is read-only t
9070: 68 65 72 65 61 66 74 65 72 2e 0a 2a 2f 0a 73 74  hereafter..*/.st
9080: 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
9090: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
90a0: 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
90b0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
90c0: 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
90d0: 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
90e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
90f0: 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
9100: 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
9110: 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 6c  hmNode */.  u8 l
9120: 6f 63 6b 53 74 61 74 65 3b 20 20 20 20 20 20 20  ockState;       
9130: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
9140: 74 20 6c 6f 63 6b 20 73 74 61 74 65 20 2a 2f 0a  t lock state */.
9150: 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9170: 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
9180: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
9190: 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 68 61 73  utex */.  u8 has
91a0: 4d 75 74 65 78 42 75 66 3b 20 20 20 20 20 20 20  MutexBuf;       
91b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
91c0: 68 6f 6c 64 69 6e 67 20 70 46 69 6c 65 2d 3e 6d  holding pFile->m
91d0: 75 74 65 78 42 75 66 20 2a 2f 0a 20 20 75 38 20  utexBuf */.  u8 
91e0: 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
91f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
9200: 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
9210: 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 65 78 63  held */.  u8 exc
9220: 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
9230: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
9240: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
9250: 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  held */.#ifdef S
9260: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
9270: 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
9280: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
9290: 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
92a0: 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68  n with its winSh
92b0: 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  mNode */.#endif.
92c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 20 69  };../*.** Size i
92d0: 6e 63 72 65 6d 65 6e 74 20 62 79 20 77 68 69 63  ncrement by whic
92e0: 68 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  h shared memory 
92f0: 67 72 6f 77 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  grows.*/.#define
9300: 20 53 51 4c 49 54 45 5f 57 49 4e 5f 53 48 4d 5f   SQLITE_WIN_SHM_
9310: 49 4e 43 52 20 20 34 30 39 36 0a 0a 2f 2a 0a 2a  INCR  4096../*.*
9320: 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
9330: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
9340: 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
9350: 42 41 53 45 20 20 20 20 20 20 38 30 20 20 20 20  BASE      80    
9360: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
9370: 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  et of the first 
9380: 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
9390: 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
93a0: 20 20 20 20 20 20 20 30 78 30 31 20 20 20 20 20         0x01     
93b0: 20 2f 2a 20 4d 61 73 6b 20 66 6f 72 20 44 65 61   /* Mask for Dea
93c0: 64 2d 4d 61 6e 2d 53 77 69 74 63 68 20 6c 6f 63  d-Man-Switch loc
93d0: 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  k */.#define WIN
93e0: 5f 53 48 4d 5f 41 20 20 20 20 20 20 20 20 20 30  _SHM_A         0
93f0: 78 31 30 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b  x10      /* Mask
9400: 20 66 6f 72 20 72 65 67 69 6f 6e 20 6c 6f 63 6b   for region lock
9410: 73 2e 2e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  s... */.#define 
9420: 57 49 4e 5f 53 48 4d 5f 42 20 20 20 20 20 20 20  WIN_SHM_B       
9430: 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20 57    0x20.#define W
9440: 49 4e 5f 53 48 4d 5f 43 20 20 20 20 20 20 20 20  IN_SHM_C        
9450: 20 30 78 34 30 0a 23 64 65 66 69 6e 65 20 57 49   0x40.#define WI
9460: 4e 5f 53 48 4d 5f 44 20 20 20 20 20 20 20 20 20  N_SHM_D         
9470: 30 78 38 30 0a 0a 23 69 66 64 65 66 20 53 51 4c  0x80..#ifdef SQL
9480: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
9490: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
94a0: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
94b0: 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 73  ated string in s
94c0: 74 61 74 69 63 20 6d 65 6d 6f 72 79 20 74 68 61  tatic memory tha
94d0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 61  t.** describes a
94e0: 20 6c 6f 63 6b 69 6e 67 20 6d 61 73 6b 2e 20 20   locking mask.  
94f0: 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 6f 66  The string is of
9500: 20 74 68 65 20 66 6f 72 6d 20 22 4d 53 41 42 43   the form "MSABC
9510: 44 22 20 77 69 74 68 0a 2a 2a 20 65 61 63 68 20  D" with.** each 
9520: 63 68 61 72 61 63 74 65 72 20 72 65 70 72 65 73  character repres
9530: 65 6e 74 69 6e 67 20 61 20 6c 6f 63 6b 2e 20 20  enting a lock.  
9540: 22 4d 22 20 66 6f 72 20 4d 55 54 45 58 2c 20 22  "M" for MUTEX, "
9550: 53 22 20 66 6f 72 20 44 4d 53 2c 20 0a 2a 2a 20  S" for DMS, .** 
9560: 61 6e 64 20 22 41 22 20 74 68 72 6f 75 67 68 20  and "A" through 
9570: 22 44 22 20 66 6f 72 20 74 68 65 20 72 65 67 69  "D" for the regi
9580: 6f 6e 20 6c 6f 63 6b 73 2e 20 20 49 66 20 61 20  on locks.  If a 
9590: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 74 68  lock is held, th
95a0: 65 0a 2a 2a 20 6c 65 74 74 65 72 20 69 73 20 73  e.** letter is s
95b0: 68 6f 77 6e 2e 20 20 49 66 20 74 68 65 20 6c 6f  hown.  If the lo
95c0: 63 6b 20 69 73 20 6e 6f 74 20 68 65 6c 64 2c 20  ck is not held, 
95d0: 74 68 65 20 6c 65 74 74 65 72 20 69 73 20 63 6f  the letter is co
95e0: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 22 2e  nverted.** to ".
95f0: 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "..**.** This ro
9600: 75 74 69 6e 65 20 69 73 20 66 6f 72 20 64 65 62  utine is for deb
9610: 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 20  ugging purposes 
9620: 6f 6e 6c 79 20 61 6e 64 20 64 6f 65 73 20 6e 6f  only and does no
9630: 74 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e 20 61  t appear.** in a
9640: 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c   production buil
9650: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
9660: 73 74 20 63 68 61 72 20 2a 77 69 6e 53 68 6d 4c  st char *winShmL
9670: 6f 63 6b 53 74 72 69 6e 67 28 75 38 20 6d 61 73  ockString(u8 mas
9680: 6b 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  k){.  static cha
9690: 72 20 7a 42 75 66 5b 34 38 5d 3b 0a 20 20 73 74  r zBuf[48];.  st
96a0: 61 74 69 63 20 69 6e 74 20 69 42 75 66 20 3d 20  atic int iBuf = 
96b0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  0;.  char *z;.. 
96c0: 20 7a 20 3d 20 26 7a 42 75 66 5b 69 42 75 66 5d   z = &zBuf[iBuf]
96d0: 3b 0a 20 20 69 42 75 66 20 2b 3d 20 38 3b 0a 20  ;.  iBuf += 8;. 
96e0: 20 69 66 28 20 69 42 75 66 3e 3d 73 69 7a 65 6f   if( iBuf>=sizeo
96f0: 66 28 7a 42 75 66 29 20 29 20 69 42 75 66 20 3d  f(zBuf) ) iBuf =
9700: 20 30 3b 0a 0a 20 20 7a 5b 30 5d 20 3d 20 28 6d   0;..  z[0] = (m
9710: 61 73 6b 20 26 20 57 49 4e 5f 53 48 4d 5f 44 4d  ask & WIN_SHM_DM
9720: 53 29 20 20 20 3f 20 27 53 27 20 3a 20 27 2e 27  S)   ? 'S' : '.'
9730: 3b 0a 20 20 7a 5b 31 5d 20 3d 20 28 6d 61 73 6b  ;.  z[1] = (mask
9740: 20 26 20 57 49 4e 5f 53 48 4d 5f 41 29 20 20 20   & WIN_SHM_A)   
9750: 20 20 3f 20 27 41 27 20 3a 20 27 2e 27 3b 0a 20    ? 'A' : '.';. 
9760: 20 7a 5b 32 5d 20 3d 20 28 6d 61 73 6b 20 26 20   z[2] = (mask & 
9770: 57 49 4e 5f 53 48 4d 5f 42 29 20 20 20 20 20 3f  WIN_SHM_B)     ?
9780: 20 27 42 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b   'B' : '.';.  z[
9790: 33 5d 20 3d 20 28 6d 61 73 6b 20 26 20 57 49 4e  3] = (mask & WIN
97a0: 5f 53 48 4d 5f 43 29 20 20 20 20 20 3f 20 27 43  _SHM_C)     ? 'C
97b0: 27 20 3a 20 27 2e 27 3b 0a 20 20 7a 5b 34 5d 20  ' : '.';.  z[4] 
97c0: 3d 20 28 6d 61 73 6b 20 26 20 57 49 4e 5f 53 48  = (mask & WIN_SH
97d0: 4d 5f 44 29 20 20 20 20 20 3f 20 27 44 27 20 3a  M_D)     ? 'D' :
97e0: 20 27 2e 27 3b 0a 20 20 7a 5b 35 5d 20 3d 20 30   '.';.  z[5] = 0
97f0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
9800: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9810: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
9820: 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
9830: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
9840: 61 6c 6c 20 62 79 74 65 73 20 69 64 65 6e 74 69  all bytes identi
9850: 66 69 65 64 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b  fied in lockMask
9860: 2e 0a 2a 2a 0a 2a 2a 20 6c 6f 63 6b 4d 61 73 6b  ..**.** lockMask
9870: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 6d   might contain m
9880: 75 6c 74 69 70 6c 65 20 62 69 74 73 20 62 75 74  ultiple bits but
9890: 20 61 6c 6c 20 62 69 74 73 20 61 72 65 20 67 75   all bits are gu
98a0: 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 6f 20 62  aranteed.** to b
98b0: 65 20 63 6f 6e 74 69 67 75 6f 75 73 2e 0a 2a 2a  e contiguous..**
98c0: 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20  .** Locks block 
98d0: 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65  if the mask is e
98e0: 78 61 63 74 6c 79 20 57 49 4e 5f 53 48 4d 5f 43  xactly WIN_SHM_C
98f0: 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f   and are non-blo
9900: 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69  cking.** otherwi
9910: 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  se..*/.#define _
9920: 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
9930: 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
9940: 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
9950: 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
9960: 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
9970: 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
9980: 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
9990: 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
99a0: 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
99b0: 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
99c0: 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
99d0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
99e0: 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
99f0: 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
9a00: 4c 43 4b 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b  LCK */.  u8 lock
9a10: 4d 61 73 6b 20 20 20 20 20 20 20 20 20 20 20 2f  Mask           /
9a20: 2a 20 57 68 69 63 68 20 62 79 74 65 73 20 74 6f  * Which bytes to
9a30: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
9a40: 2a 2f 0a 29 7b 0a 20 20 4f 56 45 52 4c 41 50 50  */.){.  OVERLAPP
9a50: 45 44 20 6f 76 6c 70 3b 0a 20 20 44 57 4f 52 44  ED ovlp;.  DWORD
9a60: 20 64 77 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20   dwFlags;.  int 
9a70: 6e 42 79 74 65 73 3b 20 20 20 20 20 20 20 20 20  nBytes;         
9a80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
9a90: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
9aa0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
9ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9ac0: 74 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 6b 69  t into the locki
9ad0: 6e 67 20 62 79 74 65 20 72 61 6e 67 65 20 2a 2f  ng byte range */
9ae0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
9af0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9b00: 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63  lt code form Loc
9b10: 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29  k/UnlockFileEx()
9b20: 20 2a 2f 0a 20 20 75 38 20 6d 61 73 6b 3b 20 20   */.  u8 mask;  
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9b40: 61 73 6b 20 6f 66 20 62 69 74 73 20 69 6e 20 6c  ask of bits in l
9b50: 6f 63 6b 4d 61 73 6b 20 2a 2f 0a 0a 20 20 2f 2a  ockMask */..  /*
9b60: 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
9b70: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
9b80: 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
9b90: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
9ba0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9bb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
9bc0: 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
9bd0: 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
9be0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
9bf0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
9c00: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 66 28  ameters */.  if(
9c10: 20 6c 6f 63 6b 4d 61 73 6b 3d 3d 57 49 4e 5f 53   lockMask==WIN_S
9c20: 48 4d 5f 43 20 26 26 20 6c 6f 63 6b 54 79 70 65  HM_C && lockType
9c30: 21 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  !=_SHM_UNLCK ){.
9c40: 20 20 20 20 64 77 46 6c 61 67 73 20 3d 20 30 3b      dwFlags = 0;
9c50: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
9c60: 48 4d 2d 4c 4f 43 4b 20 25 64 20 72 65 71 75 65  HM-LOCK %d reque
9c70: 73 74 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 6c  sting blocking l
9c80: 6f 63 6b 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20  ock %s\n", .    
9c90: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
9ca0: 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
9cb0: 20 20 20 20 20 20 77 69 6e 53 68 6d 4c 6f 63 6b        winShmLock
9cc0: 53 74 72 69 6e 67 28 6c 6f 63 6b 4d 61 73 6b 29  String(lockMask)
9cd0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
9ce0: 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46   dwFlags = LOCKF
9cf0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
9d00: 54 45 4c 59 3b 0a 20 20 20 20 4f 53 54 52 41 43  TELY;.    OSTRAC
9d10: 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20  E(("SHM-LOCK %d 
9d20: 72 65 71 75 65 73 74 69 6e 67 20 25 73 20 25 73  requesting %s %s
9d30: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
9d40: 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e     pFile->hFile.
9d50: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
9d60: 6c 6f 63 6b 54 79 70 65 21 3d 5f 53 48 4d 5f 55  lockType!=_SHM_U
9d70: 4e 4c 43 4b 20 3f 20 22 6c 6f 63 6b 22 20 3a 20  NLCK ? "lock" : 
9d80: 22 75 6e 6c 6f 63 6b 22 2c 20 0a 20 20 20 20 20  "unlock", .     
9d90: 20 20 20 20 20 20 20 20 77 69 6e 53 68 6d 4c 6f          winShmLo
9da0: 63 6b 53 74 72 69 6e 67 28 6c 6f 63 6b 4d 61 73  ckString(lockMas
9db0: 6b 29 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  k)));.  }.  if( 
9dc0: 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
9dd0: 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
9de0: 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
9df0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20 20  LUSIVE_LOCK;..  
9e00: 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73  /* Find the firs
9e10: 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61 73  t bit in lockMas
9e20: 6b 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f  k that is set */
9e30: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
9e40: 3d 30 78 30 31 3b 20 6d 61 73 6b 21 3d 30 20 26  =0x01; mask!=0 &
9e50: 26 20 28 6c 6f 63 6b 4d 61 73 6b 26 6d 61 73 6b  & (lockMask&mask
9e60: 29 3d 3d 30 3b 20 6d 61 73 6b 20 3c 3c 3d 20 31  )==0; mask <<= 1
9e70: 2c 20 69 2b 2b 29 7b 7d 0a 20 20 61 73 73 65 72  , i++){}.  asser
9e80: 74 28 20 6d 61 73 6b 21 3d 30 20 29 3b 0a 20 20  t( mask!=0 );.  
9e90: 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c  memset(&ovlp, 0,
9ea0: 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
9eb0: 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e 4f 66 66  ED));.  ovlp.Off
9ec0: 73 65 74 20 3d 20 69 2b 57 49 4e 5f 53 48 4d 5f  set = i+WIN_SHM_
9ed0: 42 41 53 45 3b 0a 20 20 6e 42 79 74 65 73 20 3d  BASE;.  nBytes =
9ee0: 20 31 3b 0a 0a 20 20 2f 2a 20 45 78 74 65 6e 64   1;..  /* Extend
9ef0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
9f00: 67 65 20 66 6f 72 20 65 61 63 68 20 61 64 64 69  ge for each addi
9f10: 74 69 6f 6e 61 6c 20 62 69 74 20 74 68 61 74 20  tional bit that 
9f20: 69 73 20 73 65 74 20 2a 2f 0a 20 20 6d 61 73 6b  is set */.  mask
9f30: 20 3c 3c 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28   <<= 1;.  while(
9f40: 20 6d 61 73 6b 21 3d 30 20 26 26 20 28 6c 6f 63   mask!=0 && (loc
9f50: 6b 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  kMask & mask)!=0
9f60: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 73 2b 2b   ){.    nBytes++
9f70: 3b 0a 20 20 20 20 6d 61 73 6b 20 3c 3c 3d 20 31  ;.    mask <<= 1
9f80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 65 72 69  ;.  }..  /* Veri
9f90: 66 79 20 74 68 61 74 20 61 6c 6c 20 62 69 74 73  fy that all bits
9fa0: 20 73 65 74 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b   set in lockMask
9fb0: 20 61 72 65 20 63 6f 6e 74 69 67 75 6f 75 73 20   are contiguous 
9fc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 61 73  */.  assert( mas
9fd0: 6b 3d 3d 30 20 7c 7c 20 28 6c 6f 63 6b 4d 61 73  k==0 || (lockMas
9fe0: 6b 20 26 20 7e 28 6d 61 73 6b 20 7c 20 28 6d 61  k & ~(mask | (ma
9ff0: 73 6b 2d 31 29 29 29 3d 3d 30 20 29 3b 0a 0a 20  sk-1)))==0 );.. 
a000: 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
a010: 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
a020: 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
a030: 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
a040: 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 66  M_UNLCK ){.    f
a050: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 73  or(i=0; i<nBytes
a060: 3b 20 69 2b 2b 2c 20 6f 76 6c 70 2e 4f 66 66 73  ; i++, ovlp.Offs
a070: 65 74 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  et++){.      rc 
a080: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 70  = UnlockFileEx(p
a090: 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 30  File->hFile.h, 0
a0a0: 2c 20 31 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a  , 1, 0, &ovlp);.
a0b0: 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 20        if( !rc ) 
a0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
a0d0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 72 65 6c  else{.    /* rel
a0e0: 65 61 73 65 20 6f 6c 64 20 69 6e 64 69 76 69 64  ease old individ
a0f0: 75 61 6c 20 62 79 74 65 20 6c 6f 63 6b 73 20 28  ual byte locks (
a100: 69 66 20 61 6e 79 29 0a 20 20 20 20 2a 2a 20 61  if any).    ** a
a110: 6e 64 20 73 65 74 20 6e 65 77 20 69 6e 64 69 76  nd set new indiv
a120: 69 64 75 61 6c 20 62 79 74 65 20 6c 6f 63 6b 73  idual byte locks
a130: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
a140: 20 69 3c 6e 42 79 74 65 73 3b 20 69 2b 2b 2c 20   i<nBytes; i++, 
a150: 6f 76 6c 70 2e 4f 66 66 73 65 74 2b 2b 29 7b 0a  ovlp.Offset++){.
a160: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65        UnlockFile
a170: 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  Ex(pFile->hFile.
a180: 68 2c 20 30 2c 20 31 2c 20 30 2c 20 26 6f 76 6c  h, 0, 1, 0, &ovl
a190: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 4c  p);.      rc = L
a1a0: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
a1b0: 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67  >hFile.h, dwFlag
a1c0: 73 2c 20 30 2c 20 31 2c 20 30 2c 20 26 6f 76 6c  s, 0, 1, 0, &ovl
a1d0: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  p);.      if( !r
a1e0: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  c ) break;.    }
a1f0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 29  .  }.  if( !rc )
a200: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
a210: 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 45  SHM-LOCK %d %s E
a220: 52 52 4f 52 20 30 78 25 30 38 6c 78 5c 6e 22 2c  RROR 0x%08lx\n",
a230: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70   .             p
a240: 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
a250: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
a260: 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
a270: 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   ? "UnlockFileEx
a280: 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22  " : "LockFileEx"
a290: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 47  ,.             G
a2a0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
a2b0: 0a 20 20 20 20 2f 2a 20 72 65 6c 65 61 73 65 20  .    /* release 
a2c0: 69 6e 64 69 76 69 64 75 61 6c 20 62 79 74 65 20  individual byte 
a2d0: 6c 6f 63 6b 73 20 28 69 66 20 61 6e 79 29 20 2a  locks (if any) *
a2e0: 2f 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  /.    ovlp.Offse
a2f0: 74 2d 3d 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  t-=i;.    for(i=
a300: 30 3b 20 69 3c 6e 42 79 74 65 73 3b 20 69 2b 2b  0; i<nBytes; i++
a310: 2c 20 6f 76 6c 70 2e 4f 66 66 73 65 74 2b 2b 29  , ovlp.Offset++)
a320: 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69  {.      UnlockFi
a330: 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c  leEx(pFile->hFil
a340: 65 2e 68 2c 20 30 2c 20 31 2c 20 30 2c 20 26 6f  e.h, 0, 1, 0, &o
a350: 76 6c 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  vlp);.    }.  }.
a360: 20 20 72 63 20 3d 20 28 72 63 21 3d 30 29 20 3f    rc = (rc!=0) ?
a370: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
a380: 49 54 45 5f 42 55 53 59 3b 0a 0a 20 20 2f 2a 20  ITE_BUSY;..  /* 
a390: 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
a3a0: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
a3b0: 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
a3c0: 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
a3d0: 54 45 5f 44 45 42 55 47 0a 20 20 4f 53 54 52 41  TE_DEBUG.  OSTRA
a3e0: 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
a3f0: 20 22 2c 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65   ", pFile->hFile
a400: 2e 68 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .h));.  if( rc==
a410: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a420: 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f   if( lockType==_
a430: 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  SHM_UNLCK ){.   
a440: 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
a450: 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20  ock ok"));.     
a460: 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b   pFile->exclMask
a470: 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20   &= ~lockMask;. 
a480: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
a490: 65 64 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d  edMask &= ~lockM
a4a0: 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
a4b0: 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
a4c0: 4d 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  M_RDLCK ){.     
a4d0: 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
a4e0: 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20  lock ok"));.    
a4f0: 20 20 70 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73    pFile->exclMas
a500: 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a  k &= ~lockMask;.
a510: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
a520: 72 65 64 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d  redMask |= lockM
a530: 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
a540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
a550: 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 57 52 4c  ckType==_SHM_WRL
a560: 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
a570: 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
a580: 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 46   ok"));.      pF
a590: 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d  ile->exclMask |=
a5a0: 20 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 20   lockMask;.     
a5b0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61   pFile->sharedMa
a5c0: 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b  sk &= ~lockMask;
a5d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a5e0: 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
a5f0: 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a  ==_SHM_UNLCK ){.
a600: 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
a610: 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  unlock failed"))
a620: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a630: 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 52  lockType==_SHM_R
a640: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
a650: 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
a660: 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
a670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
a680: 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
a690: 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  _SHM_WRLCK );.  
a6a0: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
a6b0: 69 74 65 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ite-lock failed"
a6c0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
a6d0: 4f 53 54 52 41 43 45 28 28 22 20 2d 20 63 68 61  OSTRACE((" - cha
a6e0: 6e 67 65 20 72 65 71 75 65 73 74 65 64 20 25 73  nge requested %s
a6f0: 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 73   - afterwards %s
a700: 3a 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  :%s\n",.        
a710: 20 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 53 74 72     winShmLockStr
a720: 69 6e 67 28 6c 6f 63 6b 4d 61 73 6b 29 2c 0a 20  ing(lockMask),. 
a730: 20 20 20 20 20 20 20 20 20 20 77 69 6e 53 68 6d            winShm
a740: 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46 69 6c 65  LockString(pFile
a750: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 2c 0a 20  ->sharedMask),. 
a760: 20 20 20 20 20 20 20 20 20 20 77 69 6e 53 68 6d            winShm
a770: 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46 69 6c 65  LockString(pFile
a780: 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 29 3b 0a 23  ->exclMask)));.#
a790: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
a7a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
a7b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 75   connection p, u
a7c0: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
a7d0: 20 6c 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65   locks identifie
a7e0: 64 20 62 79 20 74 68 65 20 75 6e 6c 6f 63 6b 4d  d by the unlockM
a7f0: 61 73 6b 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ask.** parameter
a800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a810: 77 69 6e 53 68 6d 55 6e 6c 6f 63 6b 28 0a 20 20  winShmUnlock(.  
a820: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c  winShmNode *pFil
a830: 65 2c 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  e,   /* The unde
a840: 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
a850: 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77  mory file */.  w
a860: 69 6e 53 68 6d 20 2a 70 2c 20 20 20 20 20 20 20  inShm *p,       
a870: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
a880: 63 74 69 6f 6e 20 74 6f 20 62 65 20 75 6e 6c 6f  ction to be unlo
a890: 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 75 6e 6c  cked */.  u8 unl
a8a0: 6f 63 6b 4d 61 73 6b 20 20 20 20 20 20 20 20 20  ockMask         
a8b0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
a8c0: 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65 64 20   to be unlocked 
a8d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
a8e0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
a8f0: 6f 64 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ode */.  winShm 
a900: 2a 70 58 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  *pX; /* For loop
a910: 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
a920: 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
a930: 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 4d 61 73 6b   */.  u8 allMask
a940: 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
a950: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
a960: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
a970: 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 2f 2a  han "p" */..  /*
a980: 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
a990: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
a9a0: 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
a9b0: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
a9c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a9d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
a9e0: 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  le->mutex) );.. 
a9f0: 20 2f 2a 20 64 6f 6e 27 74 20 61 74 74 65 6d 70   /* don't attemp
aa00: 74 20 74 6f 20 75 6e 6c 6f 63 6b 20 61 6e 79 74  t to unlock anyt
aa10: 68 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 68 61  hing we don't ha
aa20: 76 65 20 6c 6f 63 6b 73 20 66 6f 72 20 2a 2f 0a  ve locks for */.
aa30: 20 20 69 66 28 20 28 75 6e 6c 6f 63 6b 4d 61 73    if( (unlockMas
aa40: 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
aa50: 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
aa60: 20 21 3d 20 75 6e 6c 6f 63 6b 4d 61 73 6b 20 29   != unlockMask )
aa70: 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
aa80: 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 75 6e 6c 6f  SHM-LOCK %d unlo
aa90: 63 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  cking more than 
aaa0: 77 65 20 68 61 76 65 20 6c 6f 63 6b 65 64 20 2d  we have locked -
aab0: 20 72 65 71 75 65 73 74 65 64 20 25 73 20 2d 20   requested %s - 
aac0: 68 61 76 65 20 25 73 5c 6e 22 2c 0a 20 20 20 20  have %s\n",.    
aad0: 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
aae0: 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
aaf0: 20 20 20 20 20 20 77 69 6e 53 68 6d 4c 6f 63 6b        winShmLock
ab00: 53 74 72 69 6e 67 28 75 6e 6c 6f 63 6b 4d 61 73  String(unlockMas
ab10: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
ab20: 20 77 69 6e 53 68 6d 4c 6f 63 6b 53 74 72 69 6e   winShmLockStrin
ab30: 67 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d  g(p->exclMask|p-
ab40: 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 29 3b 0a  >sharedMask)));.
ab50: 20 20 20 20 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26      unlockMask &
ab60: 3d 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  = (p->exclMask|p
ab70: 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 3b 0a 20  ->sharedMask);. 
ab80: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
ab90: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
aba0: 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
abb0: 6e 73 20 2a 2f 0a 20 20 61 6c 6c 4d 61 73 6b 20  ns */.  allMask 
abc0: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46  = 0;.  for(pX=pF
abd0: 69 6c 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ile->pFirst; pX;
abe0: 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
abf0: 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
ac00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
ac10: 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
ac20: 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
ac30: 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
ac40: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 6c 6c  ))==0 );.    all
ac50: 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
ac60: 65 64 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  edMask;.  }..  /
ac70: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
ac80: 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
ac90: 2a 2f 0a 20 20 69 66 28 20 28 75 6e 6c 6f 63 6b  */.  if( (unlock
aca0: 4d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 21  Mask & allMask)!
acb0: 3d 75 6e 6c 6f 63 6b 4d 61 73 6b 20 29 7b 0a 20  =unlockMask ){. 
acc0: 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
acd0: 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  stemLock(pFile, 
ace0: 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 75 6e 6c 6f  _SHM_UNLCK, unlo
acf0: 63 6b 4d 61 73 6b 20 26 20 7e 61 6c 6c 4d 61 73  ckMask & ~allMas
ad00: 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k);.  }else{.   
ad10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ad20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 64 6f 20  .  }..  /* Undo 
ad30: 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
ad40: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
ad50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
ad60: 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 75 6e  >exclMask &= ~un
ad70: 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 70 2d  lockMask;.    p-
ad80: 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
ad90: 75 6e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 7d 20  unlockMask;.  } 
ada0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
adb0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 72 65 61 64 65  ./*.** Get reade
adc0: 72 20 6c 6f 63 6b 73 20 66 6f 72 20 63 6f 6e 6e  r locks for conn
add0: 65 63 74 69 6f 6e 20 70 20 6f 6e 20 61 6c 6c 20  ection p on all 
ade0: 6c 6f 63 6b 73 20 69 6e 20 74 68 65 20 72 65 61  locks in the rea
adf0: 64 4d 61 73 6b 20 70 61 72 61 6d 65 74 65 72 2e  dMask parameter.
ae00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ae10: 69 6e 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28  inShmSharedLock(
ae20: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
ae30: 46 69 6c 65 2c 20 20 20 2f 2a 20 54 68 65 20 75  File,   /* The u
ae40: 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
ae50: 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
ae60: 20 20 77 69 6e 53 68 6d 20 2a 70 2c 20 20 20 20    winShm *p,    
ae70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
ae80: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 67 65 74 20  nnection to get 
ae90: 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  the shared locks
aea0: 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4d 61 73   */.  u8 readMas
aeb0: 6b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  k           /* M
aec0: 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
aed0: 63 6b 73 20 74 6f 20 62 65 20 61 63 71 75 69 72  cks to be acquir
aee0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ed */.){.  int r
aef0: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  c;        /* Res
af00: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 77 69  ult code */.  wi
af10: 6e 53 68 6d 20 2a 70 58 3b 20 20 20 2f 2a 20 46  nShm *pX;   /* F
af20: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
af30: 61 6c 6c 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  all sibling conn
af40: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 38 20  ections */.  u8 
af50: 61 6c 6c 53 68 61 72 65 64 3b 20 20 2f 2a 20 55  allShared;  /* U
af60: 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65  nion of locks he
af70: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
af80: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22  s other than "p"
af90: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
afa0: 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   to the winShmNo
afb0: 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
afc0: 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
afd0: 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
afe0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
aff0: 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74  _held(pFile->mut
b000: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  ex) );..  /* Fin
b010: 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
b020: 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
b030: 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
b040: 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
b050: 2e 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69  ..  ** If any si
b060: 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f  bling already ho
b070: 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
b080: 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20   lock, go ahead 
b090: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
b0a0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
b0b0: 2f 0a 20 20 61 6c 6c 53 68 61 72 65 64 20 3d 20  /.  allShared = 
b0c0: 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70 46 69 6c  0;.  for(pX=pFil
b0d0: 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
b0e0: 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
b0f0: 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
b100: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
b110: 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
b120: 72 65 61 64 4d 61 73 6b 29 21 3d 30 20 29 20 72  readMask)!=0 ) r
b130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
b140: 59 3b 0a 20 20 20 20 61 6c 6c 53 68 61 72 65 64  Y;.    allShared
b150: 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
b160: 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  sk;.  }..  /* Ge
b170: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  t shared locks a
b180: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
b190: 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  el, if necessary
b1a0: 20 2a 2f 0a 20 20 69 66 28 20 28 7e 61 6c 6c 53   */.  if( (~allS
b1b0: 68 61 72 65 64 29 20 26 20 72 65 61 64 4d 61 73  hared) & readMas
b1c0: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  k ){.    rc = wi
b1d0: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
b1e0: 46 69 6c 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  File, _SHM_RDLCK
b1f0: 2c 20 72 65 61 64 4d 61 73 6b 29 3b 0a 20 20 7d  , readMask);.  }
b200: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
b210: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
b220: 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
b230: 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
b240: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
b250: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
b260: 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 72 65  sharedMask |= re
b270: 61 64 4d 61 73 6b 3b 0a 20 20 7d 0a 20 20 72 65  adMask;.  }.  re
b280: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b290: 2a 20 46 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  * For connection
b2a0: 20 70 2c 20 67 65 74 20 61 6e 20 65 78 63 6c 75   p, get an exclu
b2b0: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c  sive lock on all
b2c0: 20 6c 6f 63 6b 73 20 69 64 65 6e 74 69 66 69 65   locks identifie
b2d0: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 77 72 69 74  d in.** the writ
b2e0: 65 4d 61 73 6b 20 70 61 72 61 6d 65 74 65 72 2e  eMask parameter.
b2f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b300: 69 6e 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f  inShmExclusiveLo
b310: 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ck(.  winShmNode
b320: 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 54   *pFile,    /* T
b330: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
b340: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
b350: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 2c   */.  winShm *p,
b360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b370: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
b380: 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   get the exclusi
b390: 76 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  ve locks */.  u8
b3a0: 20 77 72 69 74 65 4d 61 73 6b 20 20 20 20 20 20   writeMask      
b3b0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
b3c0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
b3d0: 74 6f 20 62 65 20 61 63 71 75 69 72 65 64 20 2a  to be acquired *
b3e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
b3f0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
b400: 63 6f 64 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  code */.  winShm
b410: 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c   *pX;   /* For l
b420: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
b430: 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
b440: 6f 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  ons */..  /* Acc
b450: 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68  ess to the winSh
b460: 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
b470: 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
b480: 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
b490: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b4a0: 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
b4b0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
b4c0: 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
b4d0: 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
b4e0: 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
b4f0: 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
b500: 0a 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20  .  ** lock.  If 
b510: 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
b520: 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
b530: 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f   away..  */.  fo
b540: 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70 46 69 72  r(pX=pFile->pFir
b550: 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
b560: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
b570: 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
b580: 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78  .    if( (pX->ex
b590: 63 6c 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61  clMask & writeMa
b5a0: 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  sk)!=0 ) return 
b5b0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b5c0: 20 69 66 28 20 28 70 58 2d 3e 73 68 61 72 65 64   if( (pX->shared
b5d0: 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61 73 6b  Mask & writeMask
b5e0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )!=0 ) return SQ
b5f0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
b600: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
b610: 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
b620: 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
b630: 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
b640: 73 73 66 75 6c 0a 20 20 2a 2a 20 61 6c 73 6f 20  ssful.  ** also 
b650: 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
b660: 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
b670: 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  ng locked..  */.
b680: 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
b690: 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 5f  temLock(pFile, _
b6a0: 53 48 4d 5f 57 52 4c 43 4b 2c 20 77 72 69 74 65  SHM_WRLCK, write
b6b0: 4d 61 73 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  Mask);.  if( rc=
b6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b6d0: 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
b6e0: 26 3d 20 7e 77 72 69 74 65 4d 61 73 6b 3b 0a 20  &= ~writeMask;. 
b6f0: 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
b700: 3d 20 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 7d  = writeMask;.  }
b710: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b720: 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
b730: 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
b740: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
b750: 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e  ies with winShmN
b760: 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
b770: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
b780: 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
b790: 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
b7a0: 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
b7b0: 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
b7c0: 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
b7d0: 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
b7e0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
b7f0: 6d 50 75 72 67 65 28 76 6f 69 64 29 7b 0a 20 20  mPurge(void){.  
b800: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
b810: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
b820: 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
b830: 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
b840: 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
b850: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
b860: 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
b870: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
b880: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
b890: 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c  ( p->mutex ) sql
b8a0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
b8b0: 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  p->mutex);.     
b8c0: 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 42 75 66   if( p->mutexBuf
b8d0: 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   ) sqlite3_mutex
b8e0: 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 42 75  _free(p->mutexBu
b8f0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  f);.      if( p-
b900: 3e 70 4d 4d 61 70 42 75 66 20 29 7b 0a 20 20 20  >pMMapBuf ){.   
b910: 20 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66       UnmapViewOf
b920: 46 69 6c 65 28 70 2d 3e 70 4d 4d 61 70 42 75 66  File(p->pMMapBuf
b930: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b940: 20 69 66 28 20 49 4e 56 41 4c 49 44 5f 48 41 4e   if( INVALID_HAN
b950: 44 4c 45 5f 56 41 4c 55 45 20 21 3d 20 70 2d 3e  DLE_VALUE != p->
b960: 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  hMap ){.        
b970: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68  CloseHandle(p->h
b980: 4d 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Map);.      }.  
b990: 20 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65      if( p->hFile
b9a0: 2e 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41  .h != INVALID_HA
b9b0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20 7b 0a 20  NDLE_VALUE ) {. 
b9c0: 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28         winClose(
b9d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
b9e0: 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20  &p->hFile);.    
b9f0: 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
ba00: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
ba10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ba20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ba30: 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
ba40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
ba50: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
ba60: 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68  nces to VFS meth
ba70: 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ods */.static in
ba80: 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65  t winOpen(sqlite
ba90: 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61  3_vfs*,const cha
baa0: 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  r*,sqlite3_file*
bab0: 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74  ,int,int*);.stat
bac0: 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
bad0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63  (sqlite3_vfs *,c
bae0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
baf0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73  ../*.** Open a s
bb00: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
bb10: 61 2e 20 20 54 68 69 73 20 70 61 72 74 69 63 75  a.  This particu
bb20: 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
bb30: 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70 70  on uses.** mmapp
bb40: 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
bb50: 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c 65 6e  zName is a filen
bb60: 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e  ame used to iden
bb70: 74 69 66 79 20 74 68 65 20 73 68 61 72 65 64 2d  tify the shared-
bb80: 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68  memory area.  Th
bb90: 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
bba0: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e  ion does not (an
bbb0: 64 20 70 65 72 68 61 70 73 20 73 68 6f 75 6c 64  d perhaps should
bbc0: 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73 20 6e   not) use this n
bbd0: 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c  ame.** directly,
bbe0: 20 62 75 74 20 72 61 74 68 65 72 20 75 73 65 20   but rather use 
bbf0: 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61 74 65  it as a template
bc00: 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e 20   for finding an 
bc10: 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6e  appropriate.** n
bc20: 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68 61 72  ame for the shar
bc30: 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61 67  ed-memory storag
bc40: 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c  e.  In this impl
bc50: 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a  ementation, the.
bc60: 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e 64 65  ** string "-inde
bc70: 78 22 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  x" is appended t
bc80: 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65 64  o zName and used
bc90: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   as the name of 
bca0: 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66  the.** mmapped f
bcb0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ile..**.** When 
bcc0: 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
bcd0: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
bce0: 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
bcf0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
bd00: 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
bd10: 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
bd20: 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
bd30: 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
bd40: 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
bd50: 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
bd60: 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
bd70: 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
bd80: 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
bd90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
bda0: 69 6e 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71 6c  inShmOpen(.  sql
bdb0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
bdc0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 74     /* The file t
bdd0: 6f 20 77 68 69 63 68 20 74 6f 20 61 74 74 61 63  o which to attac
bde0: 68 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  h shared memory 
bdf0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 77  */.){.  struct w
be00: 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20  inFile *pDbFd;  
be10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
be20: 74 61 62 61 73 65 20 74 6f 20 77 68 69 63 68 20  tabase to which 
be30: 74 6f 20 61 74 74 61 63 68 20 53 48 4d 20 2a 2f  to attach SHM */
be40: 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
be50: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
be60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
be70: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
be80: 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
be90: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
bea0: 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
beb0: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
bec0: 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
bed0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bf00: 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
bf10: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
bf20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
bf30: 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
bf40: 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
bf50: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
bf80: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
bf90: 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c   pDbFd = (winFil
bfa0: 65 2a 29 66 64 3b 0a 20 20 61 73 73 65 72 74 28  e*)fd;.  assert(
bfb0: 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
bfc0: 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
bfd0: 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
bfe0: 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
bff0: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
c000: 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
c010: 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
c020: 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
c030: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
c040: 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
c050: 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
c060: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
c070: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
c080: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
c090: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
c0a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
c0b0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
c0c0: 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61 6d 65  of(*p));.  nName
c0d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c0e0: 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
c0f0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
c100: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
c110: 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
c120: 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20 20 69  Name + 15 );.  i
c130: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
c140: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c150: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
c160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
c170: 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
c180: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29  , sizeof(*pNew))
c190: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  ;.  pNew->zFilen
c1a0: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
c1b0: 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ew[1];.  sqlite3
c1c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b  _snprintf(nName+
c1d0: 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  15, pNew->zFilen
c1e0: 61 6d 65 2c 20 22 25 73 2d 77 61 6c 2d 69 6e 64  ame, "%s-wal-ind
c1f0: 65 78 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  ex", pDbFd->zPat
c200: 68 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74  h);..  /* Look t
c210: 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69  o see if there i
c220: 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69  s an existing wi
c230: 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61  nShmNode that ca
c240: 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20  n be used..  ** 
c250: 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77  If no matching w
c260: 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e  inShmNode curren
c270: 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61  tly exists, crea
c280: 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20  te a new one..  
c290: 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
c2a0: 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70  Mutex();.  for(p
c2b0: 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d  ShmNode = winShm
c2c0: 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f  NodeList; pShmNo
c2d0: 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68  de; pShmNode=pSh
c2e0: 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  mNode->pNext){. 
c2f0: 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74     /* TBD need t
c300: 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62  o come up with b
c310: 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65  etter match here
c320: 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a  .  Perhaps.    *
c330: 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f  * use FILE_ID_BO
c340: 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75  TH_DIR_INFO Stru
c350: 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
c360: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
c370: 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ICmp(pShmNode->z
c380: 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e  Filename, pNew->
c390: 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20  zFilename)==0 ) 
c3a0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
c3b0: 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20   pShmNode ){.   
c3c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
c3d0: 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ew);.  }else{.  
c3e0: 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65    pShmNode = pNe
c3f0: 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  w;.    pNew = 0;
c400: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
c410: 4d 4d 61 70 42 75 66 20 3d 20 4e 55 4c 4c 3b 0a  MMapBuf = NULL;.
c420: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 4d      pShmNode->hM
c430: 61 70 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  ap = INVALID_HAN
c440: 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 28  DLE_VALUE;.    (
c450: 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
c460: 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
c470: 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
c480: 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
c490: 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
c4a0: 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
c4b0: 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
c4c0: 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
c4d0: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
c4e0: 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
c4f0: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
c500: 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
c510: 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
c520: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
c530: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
c540: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
c550: 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
c560: 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
c570: 3e 6d 75 74 65 78 42 75 66 20 3d 20 73 71 6c 69  >mutexBuf = sqli
c580: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
c590: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
c5a0: 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
c5b0: 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 3d 3d  Node->mutexBuf==
c5c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c5d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c5e0: 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
c5f0: 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
c600: 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
c610: 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
c620: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
c630: 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c650: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
c660: 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
c670: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
c680: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
c690: 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
c6a0: 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
c6b0: 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
c6c0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
c6d0: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
c6e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
c6f0: 45 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73  E, /* Mode flags
c700: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
c710: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
c720: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
c730: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
c740: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
c750: 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
c760: 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
c770: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
c780: 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
c790: 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
c7a0: 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
c7b0: 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
c7c0: 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
c7d0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
c7e0: 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
c7f0: 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
c800: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
c810: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
c820: 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 29 3d 3d  , WIN_SHM_DMS)==
c830: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c840: 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
c850: 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
c860: 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
c870: 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  File, 0);.    }.
c880: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c890: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c8a0: 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
c8b0: 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
c8c0: 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_RDLCK, WIN_S
c8d0: 48 4d 5f 44 4d 53 29 3b 0a 20 20 20 20 7d 0a 20  HM_DMS);.    }. 
c8e0: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
c8f0: 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
c900: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
c910: 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
c920: 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
c930: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
c940: 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
c950: 68 6d 4e 6f 64 65 3b 0a 20 20 70 2d 3e 70 4e 65  hmNode;.  p->pNe
c960: 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
c970: 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20 53 51  First;.#ifdef SQ
c980: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
c990: 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
c9a0: 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
c9b0: 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  if.  pShmNode->p
c9c0: 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 70 53 68  First = p;.  pSh
c9d0: 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
c9e0: 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
c9f0: 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
ca00: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
ca10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
ca20: 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
ca30: 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
ca40: 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
ca50: 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
ca60: 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
ca70: 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 29 3b  K, WIN_SHM_DMS);
ca80: 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 29  .  winShmPurge()
ca90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
caa0: 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66    /* This call f
cab0: 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66  rees pShmNode if
cac0: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73   required */.  s
cad0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
cae0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
caf0: 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  New);.  winShmLe
cb00: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
cb10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cb20: 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
cb30: 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
cb40: 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
cb50: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
cb60: 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
cb70: 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
cb80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
cb90: 69 6e 53 68 6d 43 6c 6f 73 65 28 0a 20 20 73 71  inShmClose(.  sq
cba0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
cbb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
cbc0: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
cbd0: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
cbe0: 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
cbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
cc00: 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69  lete after closi
cc10: 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ng if true */.){
cc20: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
cc30: 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  d;       /* Data
cc40: 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
cc50: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red-memory */.  
cc60: 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
cc70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
cc80: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
cc90: 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  osed */.  winShm
cca0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
ccb0: 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
ccc0: 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
ccd0: 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  file */.  winShm
cce0: 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
ccf0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
cd00: 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
cd10: 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44  ections */..  pD
cd20: 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
cd30: 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
cd40: 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64  >pShm;.  pShmNod
cd50: 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
cd60: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ..  /* Verify th
cd70: 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  at the connectio
cd80: 6e 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 20 68  n being closed h
cd90: 6f 6c 64 73 20 6e 6f 20 6c 6f 63 6b 73 20 2a 2f  olds no locks */
cda0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
cdb0: 63 6c 4d 61 73 6b 3d 3d 30 20 29 3b 0a 20 20 61  clMask==0 );.  a
cdc0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 65 64  ssert( p->shared
cdd0: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Mask==0 );..  /*
cde0: 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
cdf0: 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
ce00: 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
ce10: 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
ce20: 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
ce30: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
ce40: 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
ce50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
ce60: 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
ce70: 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
ce80: 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
ce90: 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
cea0: 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
ceb0: 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
cec0: 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
ced0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
cee0: 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
cef0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
cf00: 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
cf10: 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
cf20: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
cf30: 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
cf40: 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
cf50: 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
cf60: 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
cf70: 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  oo */.  winShmEn
cf80: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
cf90: 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
cfa0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
cfb0: 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
cfc0: 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
cfd0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
cfe0: 20 64 65 6c 65 74 65 46 6c 61 67 20 29 20 77 69   deleteFlag ) wi
cff0: 6e 44 65 6c 65 74 65 28 70 44 62 46 64 2d 3e 70  nDelete(pDbFd->p
d000: 56 66 73 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  Vfs, pShmNode->z
d010: 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
d020: 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 29 3b    winShmPurge();
d030: 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
d040: 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
d050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d060: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 61 73  }../*.** Increas
d070: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d080: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f  e underlying sto
d090: 72 61 67 65 20 66 6f 72 20 61 20 73 68 61 72 65  rage for a share
d0a0: 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
d0b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 71 53  ..**.** The reqS
d0c0: 69 7a 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ize parameter is
d0d0: 20 74 68 65 20 6e 65 77 20 72 65 71 75 65 73 74   the new request
d0e0: 65 64 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  ed minimum size 
d0f0: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
d100: 67 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  g.** shared memo
d110: 72 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ry.  This routin
d120: 65 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20  e may choose to 
d130: 6d 61 6b 65 20 74 68 65 20 73 68 61 72 65 64 20  make the shared 
d140: 6d 65 6d 6f 72 79 20 6c 61 72 67 65 72 0a 2a 2a  memory larger.**
d150: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
d160: 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 20 74 6f   (for example to
d170: 20 72 6f 75 6e 64 20 74 68 65 20 73 68 61 72 65   round the share
d180: 64 20 6d 65 6d 6f 72 79 20 73 69 7a 65 20 75 70  d memory size up
d190: 20 74 6f 20 61 6e 0a 2a 2a 20 6f 70 65 72 61 74   to an.** operat
d1a0: 69 6e 67 2d 73 79 73 74 65 6d 20 64 65 70 65 6e  ing-system depen
d1b0: 64 65 6e 74 20 70 61 67 65 20 73 69 7a 65 2e 29  dent page size.)
d1c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d1d0: 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 67 72  ine will only gr
d1e0: 6f 77 20 74 68 65 20 73 69 7a 65 20 6f 66 20 73  ow the size of s
d1f0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 41  hared memory.  A
d200: 20 72 65 71 75 65 73 74 20 66 6f 72 0a 2a 2a 20   request for.** 
d210: 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 20 69  a smaller size i
d220: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
d230: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
d240: 69 7a 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ize(.  sqlite3_f
d250: 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
d260: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
d270: 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
d280: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
d290: 72 65 71 53 69 7a 65 2c 20 20 20 20 20 20 20 20  reqSize,        
d2a0: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74        /* Request
d2b0: 65 64 20 73 69 7a 65 2e 20 20 2d 31 20 66 6f 72  ed size.  -1 for
d2c0: 20 71 75 65 72 79 20 6f 6e 6c 79 20 2a 2f 0a 20   query only */. 
d2d0: 20 69 6e 74 20 2a 70 4e 65 77 53 69 7a 65 20 20   int *pNewSize  
d2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
d2f0: 69 74 65 20 6e 65 77 20 73 69 7a 65 20 68 65 72  ite new size her
d300: 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
d310: 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
d320: 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
d330: 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
d340: 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
d350: 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
d360: 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
d370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d380: 0a 20 20 2a 70 4e 65 77 53 69 7a 65 20 3d 20 30  .  *pNewSize = 0
d390: 3b 0a 20 20 69 66 28 20 72 65 71 53 69 7a 65 3e  ;.  if( reqSize>
d3a0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
d3b0: 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
d3c0: 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
d3d0: 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
d3e0: 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
d3f0: 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
d400: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 29   SQLITE_OK==rc )
d410: 7b 0a 20 20 20 20 20 20 72 65 71 53 69 7a 65 20  {.      reqSize 
d420: 3d 20 28 72 65 71 53 69 7a 65 20 2b 20 53 51 4c  = (reqSize + SQL
d430: 49 54 45 5f 57 49 4e 5f 53 48 4d 5f 49 4e 43 52  ITE_WIN_SHM_INCR
d440: 20 2d 20 31 29 2f 53 51 4c 49 54 45 5f 57 49 4e   - 1)/SQLITE_WIN
d450: 5f 53 48 4d 5f 49 4e 43 52 3b 0a 20 20 20 20 20  _SHM_INCR;.     
d460: 20 72 65 71 53 69 7a 65 20 2a 3d 20 53 51 4c 49   reqSize *= SQLI
d470: 54 45 5f 57 49 4e 5f 53 48 4d 5f 49 4e 43 52 3b  TE_WIN_SHM_INCR;
d480: 0a 20 20 20 20 20 20 69 66 28 20 72 65 71 53 69  .      if( reqSi
d490: 7a 65 3e 73 7a 20 29 7b 0a 20 20 20 20 20 20 20  ze>sz ){.       
d4a0: 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
d4b0: 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
d4c0: 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
d4d0: 6c 65 2c 20 72 65 71 53 69 7a 65 29 3b 0a 20 20  le, reqSize);.  
d4e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d4f0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
d500: 3d 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =rc ){.    sqlit
d510: 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20  e3_int64 sz;.   
d520: 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
d530: 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
d540: 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
d550: 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
d560: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
d570: 29 7b 0a 20 20 20 20 20 20 2a 70 4e 65 77 53 69  ){.      *pNewSi
d580: 7a 65 20 3d 20 28 69 6e 74 29 73 7a 3b 0a 20 20  ze = (int)sz;.  
d590: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
d5a0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
d5b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
d5c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
d5d0: 2a 2a 20 4d 61 70 20 74 68 65 20 73 68 61 72 65  ** Map the share
d5e0: 64 20 73 74 6f 72 61 67 65 20 69 6e 74 6f 20 6d  d storage into m
d5f0: 65 6d 6f 72 79 2e 20 20 54 68 65 20 6d 69 6e 69  emory.  The mini
d600: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  mum size of the.
d610: 2a 2a 20 6d 61 70 70 69 6e 67 20 73 68 6f 75 6c  ** mapping shoul
d620: 64 20 62 65 20 72 65 71 4d 61 70 53 69 7a 65 20  d be reqMapSize 
d630: 69 66 20 72 65 71 4d 61 70 53 69 7a 65 20 69 73  if reqMapSize is
d640: 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 0a 2a   positive.  If.*
d650: 2a 20 72 65 71 4d 61 70 53 69 7a 65 20 69 73 20  * reqMapSize is 
d660: 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
d670: 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  , the implementa
d680: 74 69 6f 6e 20 63 61 6e 20 63 68 6f 6f 73 65 0a  tion can choose.
d690: 2a 2a 20 77 68 61 74 65 76 65 72 20 6d 61 70 70  ** whatever mapp
d6a0: 69 6e 67 20 73 69 7a 65 20 69 73 20 63 6f 6e 76  ing size is conv
d6b0: 65 6e 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 2a 70  enient..**.** *p
d6c0: 70 42 75 66 20 69 73 20 6d 61 64 65 20 74 6f 20  pBuf is made to 
d6d0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 65 6d  point to the mem
d6e0: 6f 72 79 20 77 68 69 63 68 20 69 73 20 61 20 6d  ory which is a m
d6f0: 61 70 70 69 6e 67 20 6f 66 20 74 68 65 0a 2a 2a  apping of the.**
d700: 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72   underlying stor
d710: 61 67 65 2e 20 20 41 20 6d 75 74 65 78 20 69 73  age.  A mutex is
d720: 20 61 63 71 75 69 72 65 64 20 74 6f 20 70 72 65   acquired to pre
d730: 76 65 6e 74 20 6f 74 68 65 72 20 74 68 72 65 61  vent other threa
d740: 64 73 0a 2a 2a 20 66 72 6f 6d 20 72 75 6e 6e 69  ds.** from runni
d750: 6e 67 20 77 68 69 6c 65 20 2a 70 70 42 75 66 20  ng while *ppBuf 
d760: 69 73 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  is in use in ord
d770: 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20 6f 74  er to prevent ot
d780: 68 65 72 20 74 68 72 65 61 64 73 0a 2a 2a 20 72  her threads.** r
d790: 65 6d 61 70 70 69 6e 67 20 2a 70 70 42 75 66 20  emapping *ppBuf 
d7a0: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
d7b0: 68 69 73 20 74 68 72 65 61 64 2e 20 20 54 68 65  his thread.  The
d7c0: 20 77 69 6e 53 68 6d 52 65 6c 65 61 73 65 28 29   winShmRelease()
d7d0: 0a 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 72 65  .** call will re
d7e0: 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78 2e  lease the mutex.
d7f0: 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68    However, if th
d800: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 69 73 20  e lock state is 
d810: 43 48 45 43 4b 50 4f 49 4e 54 2c 0a 2a 2a 20 74  CHECKPOINT,.** t
d820: 68 65 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20  he mutex is not 
d830: 61 63 71 75 69 72 65 64 20 62 65 63 61 75 73 65  acquired because
d840: 20 43 48 45 43 4b 50 4f 49 4e 54 20 77 69 6c 6c   CHECKPOINT will
d850: 20 6e 65 76 65 72 20 72 65 6d 61 70 20 74 68 65   never remap the
d860: 0a 2a 2a 20 62 75 66 66 65 72 2e 20 20 52 45 43  .** buffer.  REC
d870: 4f 56 45 52 20 6d 69 67 68 74 20 72 65 6d 61 70  OVER might remap
d880: 2c 20 74 68 6f 75 67 68 2c 20 73 6f 20 43 48 45  , though, so CHE
d890: 43 4b 50 4f 49 4e 54 20 77 69 6c 6c 20 61 63 71  CKPOINT will acq
d8a0: 75 69 72 65 0a 2a 2a 20 74 68 65 20 6d 75 74 65  uire.** the mute
d8b0: 78 20 69 66 20 61 6e 64 20 77 68 65 6e 20 69 74  x if and when it
d8c0: 20 70 72 6f 6d 6f 74 65 73 20 74 6f 20 52 45 43   promotes to REC
d8d0: 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20 52 45 43 4f  OVER..**.** RECO
d8e0: 56 45 52 20 6e 65 65 64 73 20 74 6f 20 62 65 20  VER needs to be 
d8f0: 61 74 6f 6d 69 63 2e 20 20 54 68 65 20 73 61 6d  atomic.  The sam
d900: 65 20 6d 75 74 65 78 20 74 68 61 74 20 70 72 65  e mutex that pre
d910: 76 65 6e 74 73 20 2a 70 70 42 75 66 20 66 72 6f  vents *ppBuf fro
d920: 6d 0a 2a 2a 20 62 65 69 6e 67 20 72 65 6d 61 70  m.** being remap
d930: 70 65 64 20 61 6c 73 6f 20 70 72 65 76 65 6e 74  ped also prevent
d940: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
d950: 74 68 72 65 61 64 20 66 72 6f 6d 20 62 65 69 6e  thread from bein
d960: 67 20 69 6e 0a 2a 2a 20 52 45 43 4f 56 45 52 20  g in.** RECOVER 
d970: 61 74 20 61 20 74 69 6d 65 2e 20 20 42 75 74 2c  at a time.  But,
d980: 20 52 45 43 4f 56 45 52 20 73 6f 6d 65 74 69 6d   RECOVER sometim
d990: 65 73 20 77 61 6e 74 73 20 74 6f 20 72 65 6d 61  es wants to rema
d9a0: 70 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 54 6f 20  p itself..** To 
d9b0: 70 72 65 76 65 6e 74 20 52 45 43 4f 56 45 52 20  prevent RECOVER 
d9c0: 66 72 6f 6d 20 6c 6f 73 69 6e 67 20 69 74 73 20  from losing its 
d9d0: 6c 6f 63 6b 20 77 68 69 6c 65 20 72 65 6d 61 70  lock while remap
d9e0: 70 69 6e 67 2c 20 74 68 65 0a 2a 2a 20 6d 75 74  ping, the.** mut
d9f0: 65 78 20 69 73 20 6e 6f 74 20 72 65 6c 65 61 73  ex is not releas
da00: 65 64 20 62 79 20 77 69 6e 53 68 6d 52 65 6c 65  ed by winShmRele
da10: 61 73 65 28 29 20 77 68 65 6e 20 69 6e 20 52 45  ase() when in RE
da20: 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20 2a 70 4e  COVER..**.** *pN
da30: 65 77 4d 61 70 53 69 7a 65 20 69 73 20 73 65 74  ewMapSize is set
da40: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
da50: 74 68 65 20 6d 61 70 70 69 6e 67 2e 0a 2a 2a 0a  the mapping..**.
da60: 2a 2a 20 2a 70 70 42 75 66 20 61 6e 64 20 2a 70  ** *ppBuf and *p
da70: 4e 65 77 4d 61 70 53 69 7a 65 20 6d 69 67 68 74  NewMapSize might
da80: 20 62 65 20 4e 55 4c 4c 20 61 6e 64 20 7a 65 72   be NULL and zer
da90: 6f 20 69 66 20 6e 6f 20 73 70 61 63 65 20 68 61  o if no space ha
daa0: 73 0a 2a 2a 20 79 65 74 20 62 65 65 6e 20 61 6c  s.** yet been al
dab0: 6c 6f 63 61 74 65 64 20 74 6f 20 74 68 65 20 75  located to the u
dac0: 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67  nderlying storag
dad0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
dae0: 20 77 69 6e 53 68 6d 47 65 74 28 0a 20 20 73 71   winShmGet(.  sq
daf0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
db00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
db10: 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
db20: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
db30: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72  emory */.  int r
db40: 65 71 4d 61 70 53 69 7a 65 2c 20 20 20 20 20 20  eqMapSize,      
db50: 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64      /* Requested
db60: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67   size of mapping
db70: 2e 20 2d 31 20 6d 65 61 6e 73 20 64 6f 6e 27 74  . -1 means don't
db80: 20 63 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   care */.  int *
db90: 70 4e 65 77 4d 61 70 53 69 7a 65 2c 20 20 20 20  pNewMapSize,    
dba0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
dbb0: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67   size of mapping
dbc0: 20 68 65 72 65 20 2a 2f 0a 20 20 76 6f 69 64 20   here */.  void 
dbd0: 2a 2a 70 70 42 75 66 20 20 20 20 20 20 20 20 20  **ppBuf         
dbe0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6d 61 70      /* Write map
dbf0: 70 69 6e 67 20 62 75 66 66 65 72 20 6f 72 69 67  ping buffer orig
dc00: 69 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  in here */.){.  
dc10: 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
dc20: 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
dc30: 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62   winShm *p = pDb
dc40: 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53  Fd->pShm;.  winS
dc50: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
dc60: 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
dc70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dc80: 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  E_OK;..  if( p->
dc90: 6c 6f 63 6b 53 74 61 74 65 21 3d 53 51 4c 49 54  lockState!=SQLIT
dca0: 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54  E_SHM_CHECKPOINT
dcb0: 20 26 26 20 70 2d 3e 68 61 73 4d 75 74 65 78 42   && p->hasMutexB
dcc0: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  uf==0 ){.    ass
dcd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
dce0: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 53 68 6d 4e  ex_notheld(pShmN
dcf0: 6f 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ode->mutex) );. 
dd00: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
dd10: 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
dd20: 3e 6d 75 74 65 78 42 75 66 29 3b 0a 20 20 20 20  >mutexBuf);.    
dd30: 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 3d  p->hasMutexBuf =
dd40: 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
dd50: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
dd60: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
dd70: 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
dd80: 73 7a 4d 61 70 3d 3d 30 20 7c 7c 20 72 65 71 4d  szMap==0 || reqM
dd90: 61 70 53 69 7a 65 3e 70 53 68 6d 4e 6f 64 65 2d  apSize>pShmNode-
dda0: 3e 73 7a 4d 61 70 20 29 7b 0a 20 20 20 20 69 6e  >szMap ){.    in
ddb0: 74 20 61 63 74 75 61 6c 53 69 7a 65 3b 0a 20 20  t actualSize;.  
ddc0: 20 20 69 66 28 20 77 69 6e 53 68 6d 53 69 7a 65    if( winShmSize
ddd0: 28 66 64 2c 20 2d 31 2c 20 26 61 63 74 75 61 6c  (fd, -1, &actual
dde0: 53 69 7a 65 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  Size)==SQLITE_OK
ddf0: 0a 20 20 20 20 20 26 26 20 72 65 71 4d 61 70 53  .     && reqMapS
de00: 69 7a 65 3c 61 63 74 75 61 6c 53 69 7a 65 0a 20  ize<actualSize. 
de10: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 71 4d     ){.      reqM
de20: 61 70 53 69 7a 65 20 3d 20 61 63 74 75 61 6c 53  apSize = actualS
de30: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
de40: 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d  f( pShmNode->pMM
de50: 61 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 69  apBuf ){.      i
de60: 66 28 20 21 55 6e 6d 61 70 56 69 65 77 4f 66 46  f( !UnmapViewOfF
de70: 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d  ile(pShmNode->pM
de80: 4d 61 70 42 75 66 29 20 29 7b 0a 20 20 20 20 20  MapBuf) ){.     
de90: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73     pShmNode->las
dea0: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
deb0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
dec0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ded0: 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RR;.      }.    
dee0: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 53    CloseHandle(pS
def0: 68 6d 4e 6f 64 65 2d 3e 68 4d 61 70 29 3b 0a 20  hmNode->hMap);. 
df00: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
df10: 4d 61 70 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  Map = INVALID_HA
df20: 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
df30: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
df40: 5f 4f 4b 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20  _OK == rc ){.   
df50: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d     pShmNode->pMM
df60: 61 70 42 75 66 20 3d 20 30 3b 0a 20 20 20 20 20  apBuf = 0;.     
df70: 20 69 66 28 20 72 65 71 4d 61 70 53 69 7a 65 20   if( reqMapSize 
df80: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
df90: 2f 2a 20 63 61 6e 27 74 20 63 72 65 61 74 65 20  /* can't create 
dfa0: 30 20 62 79 74 65 20 66 69 6c 65 20 6d 61 70 70  0 byte file mapp
dfb0: 69 6e 67 20 69 6e 20 57 69 6e 64 6f 77 73 20 2a  ing in Windows *
dfc0: 2f 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  /.        pShmNo
dfd0: 64 65 2d 3e 73 7a 4d 61 70 20 3d 20 30 3b 0a 20  de->szMap = 0;. 
dfe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dff0: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 74 68      /* create th
e000: 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 6f  e file mapping o
e010: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 20  bject */.       
e020: 20 69 66 28 20 49 4e 56 41 4c 49 44 5f 48 41 4e   if( INVALID_HAN
e030: 44 4c 45 5f 56 41 4c 55 45 20 3d 3d 20 70 53 68  DLE_VALUE == pSh
e040: 6d 4e 6f 64 65 2d 3e 68 4d 61 70 20 29 7b 0a 20  mNode->hMap ){. 
e050: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 42 44 20           /* TBD 
e060: 70 72 6f 76 69 64 65 20 61 6e 20 6f 62 6a 65 63  provide an objec
e070: 74 20 6e 61 6d 65 20 74 6f 20 65 61 63 68 20 66  t name to each f
e080: 69 6c 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ile.          **
e090: 20 6d 61 70 70 69 6e 67 20 73 6f 20 69 74 20 63   mapping so it c
e0a0: 61 6e 20 62 65 20 72 65 2d 75 73 65 64 20 61 63  an be re-used ac
e0b0: 72 6f 73 73 20 70 72 6f 63 65 73 73 65 73 2e 0a  ross processes..
e0c0: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
e0d0: 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
e0e0: 3e 68 4d 61 70 20 3d 20 43 72 65 61 74 65 46 69  >hMap = CreateFi
e0f0: 6c 65 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f  leMapping(pShmNo
e100: 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44         PAGE_READ
e170: 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20  WRITE,.         
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
e1d0: 71 4d 61 70 53 69 7a 65 2c 0a 20 20 20 20 20 20  qMapSize,.      
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20      NULL);.     
e210: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e220: 20 4e 55 4c 4c 3d 3d 70 53 68 6d 4e 6f 64 65 2d   NULL==pShmNode-
e230: 3e 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  >hMap ){.       
e240: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73     pShmNode->las
e250: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
e260: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
e270: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
e280: 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20  OERR;.          
e290: 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20  pShmNode->szMap 
e2a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
e2b0: 53 68 6d 4e 6f 64 65 2d 3e 68 4d 61 70 20 3d 20  ShmNode->hMap = 
e2c0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
e2d0: 41 4c 55 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  ALUE;.        }e
e2e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
e2f0: 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75  ShmNode->pMMapBu
e300: 66 20 3d 20 4d 61 70 56 69 65 77 4f 66 46 69 6c  f = MapViewOfFil
e310: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 4d 61 70  e(pShmNode->hMap
e320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45              FILE
e350: 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
e360: 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
e370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 72 65 71 4d 61 70 53 69 7a 65 29 3b 0a 20 20 20  reqMapSize);.   
e400: 20 20 20 20 20 20 20 69 66 28 20 21 70 53 68 6d         if( !pShm
e410: 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42 75 66 20 29  Node->pMMapBuf )
e420: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
e430: 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
e440: 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
e450: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
e460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e470: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  R;.            p
e480: 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20 3d  ShmNode->szMap =
e490: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
e4a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
e4b0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70   pShmNode->szMap
e4c0: 20 3d 20 72 65 71 4d 61 70 53 69 7a 65 3b 0a 20   = reqMapSize;. 
e4d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e4e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e4f0: 20 7d 0a 20 20 7d 0a 20 20 2a 70 4e 65 77 4d 61   }.  }.  *pNewMa
e500: 70 53 69 7a 65 20 3d 20 70 53 68 6d 4e 6f 64 65  pSize = pShmNode
e510: 2d 3e 73 7a 4d 61 70 3b 0a 20 20 2a 70 70 42 75  ->szMap;.  *ppBu
e520: 66 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d  f = pShmNode->pM
e530: 4d 61 70 42 75 66 3b 0a 20 20 73 71 6c 69 74 65  MapBuf;.  sqlite
e540: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
e550: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
e560: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e570: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74 68  /*.** Release th
e580: 65 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  e lock held on t
e590: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
e5a0: 20 73 65 67 6d 65 6e 74 20 73 6f 20 74 68 61 74   segment so that
e5b0: 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61 64   other.** thread
e5c0: 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 72 65  s are free to re
e5d0: 73 69 7a 65 20 69 74 20 69 66 20 6e 65 63 65 73  size it if neces
e5e0: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sary..**.** If t
e5f0: 68 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 63  he lock is not c
e600: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2c 20 74  urrently held, t
e610: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
e620: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
e630: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
e640: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6f 62 6a 65  ared-memory obje
e650: 63 74 20 69 73 20 69 6e 20 6c 6f 63 6b 20 73 74  ct is in lock st
e660: 61 74 65 20 52 45 43 4f 56 45 52 2c 20 74 68 65  ate RECOVER, the
e670: 6e 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72  n we do not.** r
e680: 65 61 6c 6c 79 20 77 61 6e 74 20 74 6f 20 72 65  eally want to re
e690: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2c 20  lease the lock, 
e6a0: 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65 20  so in that case 
e6b0: 74 6f 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  too, this routin
e6c0: 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  e.** is a no-op.
e6d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
e6e0: 69 6e 53 68 6d 52 65 6c 65 61 73 65 28 73 71 6c  inShmRelease(sql
e6f0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 29 7b 0a  ite3_file *fd){.
e700: 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
e710: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
e720: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
e730: 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
e740: 28 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66  ( p->hasMutexBuf
e750: 20 26 26 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65   && p->lockState
e760: 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43  !=SQLITE_SHM_REC
e770: 4f 56 45 52 20 29 7b 0a 20 20 20 20 77 69 6e 53  OVER ){.    winS
e780: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
e790: 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
e7a0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
e7b0: 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
e7c0: 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
e7d0: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
e7e0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
e7f0: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66  hmNode->mutexBuf
e800: 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75 74  );.    p->hasMut
e810: 65 78 42 75 66 20 3d 20 30 3b 0a 20 20 7d 0a 20  exBuf = 0;.  }. 
e820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e830: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6d 62  K;.}../*.** Symb
e840: 6f 6c 69 63 20 6e 61 6d 65 73 20 66 6f 72 20 4c  olic names for L
e850: 4f 43 4b 20 73 74 61 74 65 73 20 75 73 65 64 20  OCK states used 
e860: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a  for debugging..*
e870: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e880: 44 45 42 55 47 0a 73 74 61 74 69 63 20 63 6f 6e  DEBUG.static con
e890: 73 74 20 63 68 61 72 20 2a 61 7a 4c 6b 4e 61 6d  st char *azLkNam
e8a0: 65 5b 5d 20 3d 20 7b 0a 20 20 22 55 4e 4c 4f 43  e[] = {.  "UNLOC
e8b0: 4b 22 2c 0a 20 20 22 52 45 41 44 22 2c 0a 20 20  K",.  "READ",.  
e8c0: 22 52 45 41 44 5f 46 55 4c 4c 22 2c 0a 20 20 22  "READ_FULL",.  "
e8d0: 57 52 49 54 45 22 2c 0a 20 20 22 50 45 4e 44 49  WRITE",.  "PENDI
e8e0: 4e 47 22 2c 0a 20 20 22 43 48 45 43 4b 50 4f 49  NG",.  "CHECKPOI
e8f0: 4e 54 22 2c 0a 20 20 22 52 45 43 4f 56 45 52 22  NT",.  "RECOVER"
e900: 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  .};.#endif.../*.
e910: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
e920: 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
e930: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
e940: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
e950: 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a  int winShmLock(.
e960: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
e970: 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
e980: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
e990: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
e9a0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ry */.  int desi
e9b0: 72 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  redLock,        
e9c0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 51 4c     /* One of SQL
e9d0: 49 54 45 5f 53 48 4d 5f 78 78 78 78 78 20 6c 6f  ITE_SHM_xxxxx lo
e9e0: 63 6b 69 6e 67 20 73 74 61 74 65 73 20 2a 2f 0a  cking states */.
e9f0: 20 20 69 6e 74 20 2a 70 47 6f 74 4c 6f 63 6b 20    int *pGotLock 
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea10: 54 68 65 20 6c 6f 63 6b 20 79 6f 75 20 61 63 74  The lock you act
ea20: 75 61 6c 6c 79 20 67 6f 74 20 2a 2f 0a 29 7b 0a  ually got */.){.
ea30: 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
ea40: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
ea50: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
ea60: 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69  DbFd->pShm;.  wi
ea70: 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
ea80: 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
ea90: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
eaa0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 0a 20  ITE_PROTOCOL;.. 
eab0: 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74 20 53 51   /* Note that SQ
eac0: 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55  LITE_SHM_READ_FU
ead0: 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 48  LL and SQLITE_SH
eae0: 4d 5f 50 45 4e 44 49 4e 47 20 61 72 65 20 6e 65  M_PENDING are ne
eaf0: 76 65 72 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c  ver.  ** directl
eb00: 79 20 72 65 71 75 65 73 74 65 64 3b 20 74 68 65  y requested; the
eb10: 79 20 61 72 65 20 73 69 64 65 20 65 66 66 65 63  y are side effec
eb20: 74 73 20 66 72 6f 6d 20 72 65 71 75 65 73 74 69  ts from requesti
eb30: 6e 67 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53  ng.  ** SQLITE_S
eb40: 48 4d 5f 52 45 41 44 20 61 6e 64 20 53 51 4c 49  HM_READ and SQLI
eb50: 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e  TE_SHM_CHECKPOIN
eb60: 54 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  T, respectively.
eb70: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
eb80: 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
eb90: 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20  ITE_SHM_UNLOCK. 
eba0: 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65 64        || desired
ebb0: 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  Lock==SQLITE_SHM
ebc0: 5f 52 45 41 44 0a 20 20 20 20 20 20 20 7c 7c 20  _READ.       || 
ebd0: 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
ebe0: 49 54 45 5f 53 48 4d 5f 57 52 49 54 45 0a 20 20  ITE_SHM_WRITE.  
ebf0: 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65 64 4c       || desiredL
ec00: 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ock==SQLITE_SHM_
ec10: 43 48 45 43 4b 50 4f 49 4e 54 0a 20 20 20 20 20  CHECKPOINT.     
ec20: 20 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b    || desiredLock
ec30: 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43  ==SQLITE_SHM_REC
ec40: 4f 56 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OVER );..  /* Re
ec50: 74 75 72 6e 20 64 69 72 65 63 74 6c 79 20 69 66  turn directly if
ec60: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
ec70: 6c 6f 63 6b 20 73 74 61 74 65 20 71 75 65 72 79  lock state query
ec80: 2c 20 6f 72 20 69 66 0a 20 20 2a 2a 20 74 68 65  , or if.  ** the
ec90: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61   connection is a
eca0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 64 65  lready in the de
ecb0: 73 69 72 65 64 20 6c 6f 63 6b 69 6e 67 20 73 74  sired locking st
ecc0: 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ate..  */.  if( 
ecd0: 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 70 2d 3e  desiredLock==p->
ece0: 6c 6f 63 6b 53 74 61 74 65 0a 20 20 20 7c 7c 20  lockState.   || 
ecf0: 28 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51  (desiredLock==SQ
ed00: 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 20 26 26  LITE_SHM_READ &&
ed10: 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
ed20: 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46  QLITE_SHM_READ_F
ed30: 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 4f 53  ULL).  ){.    OS
ed40: 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
ed50: 20 25 64 20 73 68 6d 69 64 2d 25 64 2c 20 70 69   %d shmid-%d, pi
ed60: 64 2d 25 64 20 72 65 71 75 65 73 74 20 25 73 20  d-%d request %s 
ed70: 61 6e 64 20 67 6f 74 20 25 73 5c 6e 22 2c 0a 20  and got %s\n",. 
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
ed90: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69              p->i
edb0: 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72 72 65  d, (int)GetCurre
edc0: 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 61  ntProcessId(), a
edd0: 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69 72 65 64 4c  zLkName[desiredL
ede0: 6f 63 6b 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  ock],.          
edf0: 20 20 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c     azLkName[p->l
ee00: 6f 63 6b 53 74 61 74 65 5d 29 29 3b 0a 20 20 20  ockState]));.   
ee10: 20 69 66 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20   if( pGotLock ) 
ee20: 2a 70 47 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c  *pGotLock = p->l
ee30: 6f 63 6b 53 74 61 74 65 3b 0a 20 20 20 20 72 65  ockState;.    re
ee40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ee50: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
ee60: 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 73 68 6d  "SHM-LOCK %d shm
ee70: 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 72 65  id-%d, pid-%d re
ee80: 71 75 65 73 74 20 25 73 2d 3e 25 73 5c 6e 22 2c  quest %s->%s\n",
ee90: 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
eea0: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
eeb0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
eec0: 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74   (int)GetCurrent
eed0: 50 72 6f 63 65 73 73 49 64 28 29 2c 20 61 7a 4c  ProcessId(), azL
eee0: 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61  kName[p->lockSta
eef0: 74 65 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  te], .          
ef00: 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69 72 65   azLkName[desire
ef10: 64 4c 6f 63 6b 5d 29 29 3b 0a 20 20 0a 20 20 69  dLock]));.  .  i
ef20: 66 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d  f( desiredLock==
ef30: 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56  SQLITE_SHM_RECOV
ef40: 45 52 20 26 26 20 21 70 2d 3e 68 61 73 4d 75 74  ER && !p->hasMut
ef50: 65 78 42 75 66 20 29 7b 0a 20 20 20 20 61 73 73  exBuf ){.    ass
ef60: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ef70: 65 78 5f 6e 6f 74 68 65 6c 64 28 70 53 68 6d 4e  ex_notheld(pShmN
ef80: 6f 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ode->mutex) );. 
ef90: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
efa0: 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
efb0: 3e 6d 75 74 65 78 42 75 66 29 3b 0a 20 20 20 20  >mutexBuf);.    
efc0: 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 3d  p->hasMutexBuf =
efd0: 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
efe0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
eff0: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
f000: 20 20 73 77 69 74 63 68 28 20 64 65 73 69 72 65    switch( desire
f010: 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  dLock ){.    cas
f020: 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  e SQLITE_SHM_UNL
f030: 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  OCK: {.      ass
f040: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  ert( p->lockStat
f050: 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  e!=SQLITE_SHM_RE
f060: 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20 20 77  COVER );.      w
f070: 69 6e 53 68 6d 55 6e 6c 6f 63 6b 28 70 53 68 6d  inShmUnlock(pShm
f080: 4e 6f 64 65 2c 20 70 2c 20 57 49 4e 5f 53 48 4d  Node, p, WIN_SHM
f090: 5f 41 7c 57 49 4e 5f 53 48 4d 5f 42 7c 57 49 4e  _A|WIN_SHM_B|WIN
f0a0: 5f 53 48 4d 5f 43 7c 57 49 4e 5f 53 48 4d 5f 44  _SHM_C|WIN_SHM_D
f0b0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
f0c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70  LITE_OK;.      p
f0d0: 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
f0e0: 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 3b  LITE_SHM_UNLOCK;
f0f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f100: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
f110: 49 54 45 5f 53 48 4d 5f 52 45 41 44 3a 20 7b 0a  ITE_SHM_READ: {.
f120: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6c 6f 63        if( p->loc
f130: 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
f140: 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
f150: 20 20 20 20 20 69 6e 74 20 6e 41 74 74 65 6d 70       int nAttemp
f160: 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
f170: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
f180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
f190: 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
f1a0: 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  E_SHM_UNLOCK );.
f1b0: 20 20 20 20 20 20 20 20 66 6f 72 28 6e 41 74 74          for(nAtt
f1c0: 65 6d 70 74 3d 30 3b 20 6e 41 74 74 65 6d 70 74  empt=0; nAttempt
f1d0: 3c 35 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  <5 && rc==SQLITE
f1e0: 5f 42 55 53 59 3b 20 6e 41 74 74 65 6d 70 74 2b  _BUSY; nAttempt+
f1f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  +){.          rc
f200: 20 3d 20 77 69 6e 53 68 6d 53 68 61 72 65 64 4c   = winShmSharedL
f210: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c  ock(pShmNode, p,
f220: 20 57 49 4e 5f 53 48 4d 5f 41 7c 57 49 4e 5f 53   WIN_SHM_A|WIN_S
f230: 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20 20 20  HM_B);.         
f240: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f250: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
f260: 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
f270: 68 61 72 65 64 4c 6f 63 6b 28 70 53 68 6d 4e 6f  haredLock(pShmNo
f280: 64 65 2c 20 70 2c 20 57 49 4e 5f 53 48 4d 5f 44  de, p, WIN_SHM_D
f290: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
f2a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f2c0: 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
f2d0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
f2e0: 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _FULL;.         
f2f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f300: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f310: 20 20 77 69 6e 53 68 6d 55 6e 6c 6f 63 6b 28 70    winShmUnlock(p
f320: 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 57 49 4e 5f  ShmNode, p, WIN_
f330: 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20 20 20 20  SHM_B);.        
f340: 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65      p->lockState
f350: 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45   = SQLITE_SHM_RE
f360: 41 44 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  AD;.          }.
f370: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f380: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 61 73  }else{.       as
f390: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61  sert( p->lockSta
f3a0: 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 57  te==SQLITE_SHM_W
f3b0: 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  RITE.           
f3c0: 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53 74      || p->lockSt
f3d0: 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  ate==SQLITE_SHM_
f3e0: 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20 20 20  RECOVER );.     
f3f0: 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 68     rc = winShmSh
f400: 61 72 65 64 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  aredLock(pShmNod
f410: 65 2c 20 70 2c 20 57 49 4e 5f 53 48 4d 5f 41 29  e, p, WIN_SHM_A)
f420: 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 53 68 6d  ;.        winShm
f430: 55 6e 6c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  Unlock(pShmNode,
f440: 20 70 2c 20 57 49 4e 5f 53 48 4d 5f 43 7c 57 49   p, WIN_SHM_C|WI
f450: 4e 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20  N_SHM_D);.      
f460: 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
f470: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
f480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f4a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d   case SQLITE_SHM
f4b0: 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
f4c0: 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 53  assert( p->lockS
f4d0: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
f4e0: 5f 52 45 41 44 20 0a 20 20 20 20 20 20 20 20 20  _READ .         
f4f0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53       || p->lockS
f500: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
f510: 5f 52 45 41 44 5f 46 55 4c 4c 20 29 3b 0a 20 20  _READ_FULL );.  
f520: 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 45      rc = winShmE
f530: 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 53 68  xclusiveLock(pSh
f540: 6d 4e 6f 64 65 2c 20 70 2c 20 57 49 4e 5f 53 48  mNode, p, WIN_SH
f550: 4d 5f 43 7c 57 49 4e 5f 53 48 4d 5f 44 29 3b 0a  M_C|WIN_SHM_D);.
f560: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f570: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f580: 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
f590: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49  = SQLITE_SHM_WRI
f5a0: 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
f5b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f5c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
f5d0: 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 3a 20 7b  HM_CHECKPOINT: {
f5e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
f5f0: 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c  ->lockState==SQL
f600: 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20  ITE_SHM_UNLOCK. 
f610: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
f620: 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54  lockState==SQLIT
f630: 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 0a 20 20  E_SHM_PENDING.  
f640: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
f650: 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
f660: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
f670: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
f680: 20 77 69 6e 53 68 6d 45 78 63 6c 75 73 69 76 65   winShmExclusive
f690: 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70  Lock(pShmNode, p
f6a0: 2c 20 57 49 4e 5f 53 48 4d 5f 42 7c 57 49 4e 5f  , WIN_SHM_B|WIN_
f6b0: 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 20 20  SHM_C);.        
f6c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f6d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
f6e0: 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d 20 53 51  ->lockState = SQ
f6f0: 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47  LITE_SHM_PENDING
f700: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f710: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
f720: 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
f730: 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20 29  TE_SHM_PENDING )
f740: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
f750: 69 6e 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f  inShmExclusiveLo
f760: 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20  ck(pShmNode, p, 
f770: 57 49 4e 5f 53 48 4d 5f 41 29 3b 0a 20 20 20 20  WIN_SHM_A);.    
f780: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f790: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f7a0: 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
f7b0: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45  = SQLITE_SHM_CHE
f7c0: 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20 20 20  CKPOINT;.       
f7d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f7e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f7f0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
f800: 20 20 20 61 73 73 65 72 74 28 20 64 65 73 69 72     assert( desir
f810: 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53  edLock==SQLITE_S
f820: 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20  HM_RECOVER );.  
f830: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
f840: 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
f850: 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20 20 20 20  _SHM_READ.      
f860: 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63 6b 53       || p->lockS
f870: 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  tate==SQLITE_SHM
f880: 5f 52 45 41 44 5f 46 55 4c 4c 0a 20 20 20 20 20  _READ_FULL.     
f890: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f8a0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f8b0: 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  held(pShmNode->m
f8c0: 75 74 65 78 42 75 66 29 20 29 3b 0a 20 20 20 20  utexBuf) );.    
f8d0: 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 45 78 63    rc = winShmExc
f8e0: 6c 75 73 69 76 65 4c 6f 63 6b 28 70 53 68 6d 4e  lusiveLock(pShmN
f8f0: 6f 64 65 2c 20 70 2c 20 57 49 4e 5f 53 48 4d 5f  ode, p, WIN_SHM_
f900: 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  C);.      if( rc
f910: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f920: 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74         p->lockSt
f930: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ate = SQLITE_SHM
f940: 5f 52 45 43 4f 56 45 52 3b 0a 20 20 20 20 20 20  _RECOVER;.      
f950: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f960: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
f970: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
f980: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
f990: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
f9a0: 2d 4c 4f 43 4b 20 25 64 20 73 68 6d 69 64 2d 25  -LOCK %d shmid-%
f9b0: 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 73  d, pid-%d got %s
f9c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f9d0: 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
f9e0: 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  h, .           p
f9f0: 2d 3e 69 64 2c 20 28 69 6e 74 29 47 65 74 43 75  ->id, (int)GetCu
fa00: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
fa10: 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f  , azLkName[p->lo
fa20: 63 6b 53 74 61 74 65 5d 29 29 3b 0a 20 20 69 66  ckState]));.  if
fa30: 28 20 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70 47  ( pGotLock ) *pG
fa40: 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63 6b  otLock = p->lock
fa50: 53 74 61 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  State;.  return 
fa60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
fa70: 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
fa80: 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
fa90: 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
faa0: 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
fab0: 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
fac0: 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
fad0: 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
fae0: 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
faf0: 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
fb00: 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
fb10: 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
fb20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
fb30: 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
fb40: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
fb50: 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
fb60: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
fb70: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
fb80: 72 79 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 4d 65  ry */.){.  /* Me
fb90: 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f  moryBarrier(); /
fba0: 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  / does not work 
fbb0: 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77  -- do not know w
fbc0: 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53  hy not */.  winS
fbd0: 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
fbe0: 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
fbf0: 65 78 28 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  ex();.}..#else.#
fc00: 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4f 70   define winShmOp
fc10: 65 6e 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  en    0.# define
fc20: 20 77 69 6e 53 68 6d 53 69 7a 65 20 20 20 20 30   winShmSize    0
fc30: 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
fc40: 47 65 74 20 20 20 20 20 30 0a 23 20 64 65 66 69  Get     0.# defi
fc50: 6e 65 20 77 69 6e 53 68 6d 52 65 6c 65 61 73 65  ne winShmRelease
fc60: 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
fc70: 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
fc80: 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69  fine winShmBarri
fc90: 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69  er 0.# define wi
fca0: 6e 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a 23 65  nShmClose   0.#e
fcb0: 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
fcc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
fcd0: 2a 2f 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./*.**********
fce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fcf0: 2a 2a 2a 20 45 6e 64 20 53 68 61 72 65 64 20 4d  *** End Shared M
fd00: 65 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  emory **********
fd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd20: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
fd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd70: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
fd80: 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
fd90: 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
fda0: 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
fdb0: 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
fdc0: 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
fdd0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
fde0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
fdf0: 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
fe00: 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  {.  2,          
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
fe30: 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 52 65  inClose,.  winRe
fe40: 61 64 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a  ad,.  winWrite,.
fe50: 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20    winTruncate,. 
fe60: 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 46   winSync,.  winF
fe70: 69 6c 65 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f  ileSize,.  winLo
fe80: 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c  ck,.  winUnlock,
fe90: 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
fea0: 76 65 64 4c 6f 63 6b 2c 0a 20 20 77 69 6e 46 69  vedLock,.  winFi
feb0: 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 77 69 6e  leControl,.  win
fec0: 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 77 69  SectorSize,.  wi
fed0: 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
fee0: 69 73 74 69 63 73 2c 0a 20 20 77 69 6e 53 68 6d  istics,.  winShm
fef0: 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
ff00: 20 20 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a     /* xShmOpen *
ff10: 2f 0a 20 20 77 69 6e 53 68 6d 53 69 7a 65 2c 20  /.  winShmSize, 
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff30: 78 53 68 6d 53 69 7a 65 20 2a 2f 0a 20 20 77 69  xShmSize */.  wi
ff40: 6e 53 68 6d 47 65 74 2c 20 20 20 20 20 20 20 20  nShmGet,        
ff50: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 47 65         /* xShmGe
ff60: 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 52 65 6c  t */.  winShmRel
ff70: 65 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  ease,           
ff80: 2f 2a 20 78 53 68 6d 52 65 6c 65 61 73 65 20 2a  /* xShmRelease *
ff90: 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ffb0: 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
ffc0: 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  nShmBarrier,    
ffd0: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
ffe0: 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
fff0: 6d 43 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20  mClose          
10000 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f 73 65      /* xShmClose
10010 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   */.};../*******
10020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10060 2a 2a 2a 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ****.** Here end
10070 73 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  s the I/O method
10080 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
10090 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
100a0 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  ds object..**.**
100b0 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
100c0 6f 66 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e  of code implemen
100d0 74 73 20 74 68 65 20 56 46 53 20 6d 65 74 68 6f  ts the VFS metho
100e0 64 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..************
100f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10130 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
10140 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
10150 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
10160 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
10170 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
10180 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
10190 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
101a0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
101b0 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
101c0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
101d0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
101e0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
101f0 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
10200 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
10210 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
10220 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
10230 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
10240 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
10250 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  0;.  if( isNT() 
10260 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
10270 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  d = utf8ToUnicod
10280 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a  e(zFilename);./*
10290 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
102a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
102b0 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
102c0 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
102d0 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
102e0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
102f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e   }else{.    zCon
10300 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 4d  verted = utf8ToM
10310 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
10320 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20  #endif.  }.  /* 
10330 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
10340 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
10350 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
10360 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
10370 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
10380 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
10390 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
103a0 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
103b0 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
103c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
103d0 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
103e0 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
103f0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
10400 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
10410 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
10420 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
10430 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
10440 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
10450 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
10460 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
10470 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
10480 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  _t i, j;.  char 
10490 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41  zTempPath[MAX_PA
104a0 54 48 2b 31 5d 3b 0a 20 20 69 66 28 20 73 71 6c  TH+1];.  if( sql
104b0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
104c0 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
104d0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
104e0 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
104f0 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  th, "%s", sqlite
10500 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
10510 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
10520 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61  sNT() ){.    cha
10530 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57  r *zMulti;.    W
10540 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b 4d  CHAR zWidePath[M
10550 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65  AX_PATH];.    Ge
10560 74 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50  tTempPathW(MAX_P
10570 41 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74  ATH-30, zWidePat
10580 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d  h);.    zMulti =
10590 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
105a0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69  WidePath);.    i
105b0 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20  f( zMulti ){.   
105c0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
105d0 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
105e0 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
105f0 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
10600 20 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20   free(zMulti);. 
10610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10630 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f 2a 20 69 73  MEM;.    }./* is
10640 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
10650 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
10660 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
10670 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
10680 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
10690 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
106a0 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
106b0 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
106c0 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
106d0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
106e0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
106f0 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
10700 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
10710 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
10720 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
10730 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
10740 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50   zMbcsPath[MAX_P
10750 41 54 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d  ATH];.    GetTem
10760 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d  pPathA(MAX_PATH-
10770 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a  30, zMbcsPath);.
10780 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
10790 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
107a0 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
107b0 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
107c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
107d0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
107e0 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
107f0 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  h, "%s", zUtf8);
10800 0a 20 20 20 20 20 20 66 72 65 65 28 7a 55 74 66  .      free(zUtf
10810 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  8);.    }else{. 
10820 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10830 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
10840 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 6f 72  #endif.  }.  for
10850 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  (i=sqlite3Strlen
10860 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69  30(zTempPath); i
10870 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b  >0 && zTempPath[
10880 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29  i-1]=='\\'; i--)
10890 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69  {}.  zTempPath[i
108a0 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
108b0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 33  _snprintf(nBuf-3
108c0 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  0, zBuf,.       
108d0 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c              "%s\
108e0 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  \"SQLITE_TEMP_FI
108f0 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70  LE_PREFIX, zTemp
10900 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c  Path);.  j = sql
10910 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
10920 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
10930 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 26 7a 42  ndomness(20, &zB
10940 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
10950 30 3b 20 69 3c 32 30 3b 20 69 2b 2b 2c 20 6a 2b  0; i<20; i++, j+
10960 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
10970 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
10980 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
10990 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
109a0 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
109b0 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
109c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
109d0 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c  MP FILENAME: %s\
109e0 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65  n", zBuf));.  re
109f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
10a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
10a10 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65  turn value of ge
10a20 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
10a30 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
10a40 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
10a50 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
10a60 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
10a70 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
10a80 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
10a90 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
10aa0 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74  atic int getLast
10ab0 45 72 72 6f 72 4d 73 67 28 69 6e 74 20 6e 42 75  ErrorMsg(int nBu
10ac0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
10ad0 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61    /* FormatMessa
10ae0 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20  ge returns 0 on 
10af0 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77  failure.  Otherw
10b00 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75  ise it.  ** retu
10b10 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
10b20 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e  f TCHARs written
10b30 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20   to the output. 
10b40 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c   ** buffer, excl
10b50 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e  uding the termin
10b60 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e  ating null char.
10b70 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 65 72  .  */.  DWORD er
10b80 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
10b90 6f 72 28 29 3b 0a 20 20 44 57 4f 52 44 20 64 77  or();.  DWORD dw
10ba0 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
10bb0 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66  *zOut = 0;..  if
10bc0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
10bd0 57 43 48 41 52 20 2a 7a 54 65 6d 70 57 69 64 65  WCHAR *zTempWide
10be0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c   = NULL;.    dwL
10bf0 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65 73 73 61  en = FormatMessa
10c00 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
10c10 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
10c20 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53  ER | FORMAT_MESS
10c30 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
10c40 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  | FORMAT_MESSAGE
10c50 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
10c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10c70 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
10c80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
10ca0 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
10ce0 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65  WSTR) &zTempWide
10cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
10d30 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
10d40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
10d50 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
10d60 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
10d70 46 38 20 2a 2f 0a 20 20 20 20 20 20 7a 4f 75 74  F8 */.      zOut
10d80 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
10d90 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20  (zTempWide);.   
10da0 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
10db0 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
10dc0 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
10dd0 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
10de0 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70   LocalFree(zTemp
10df0 57 69 64 65 29 3b 0a 20 20 20 20 7d 0a 2f 2a 20  Wide);.    }./* 
10e00 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
10e10 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
10e20 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
10e30 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
10e40 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
10e50 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
10e60 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
10e70 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
10e80 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
10e90 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
10ea0 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
10eb0 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
10ec0 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
10ed0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
10ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
10ef0 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b  r *zTemp = NULL;
10f00 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 46 6f 72  .    dwLen = For
10f10 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
10f20 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
10f30 41 54 45 5f 42 55 46 46 45 52 20 7c 20 46 4f 52  ATE_BUFFER | FOR
10f40 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
10f50 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52 4d 41 54  _SYSTEM | FORMAT
10f60 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
10f70 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 20 20 20 65 72 72 6f 72 2c 0a 20 20 20 20       error,.    
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54       (LPSTR) &zT
11000 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  emp,.           
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
11040 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
11050 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
11060 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
11070 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
11080 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 7a   UTF8 */.      z
11090 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
110a0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
110b0 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 2f  (zTemp);.      /
110c0 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
110d0 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
110e0 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
110f0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 4c 6f 63  age */.      Loc
11100 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
11110 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
11120 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
11130 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
11140 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
11150 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
11160 25 78 20 28 25 75 29 22 2c 20 65 72 72 6f 72 2c  %x (%u)", error,
11170 20 65 72 72 6f 72 29 3b 0a 20 20 7d 65 6c 73 65   error);.  }else
11180 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20  {.    /* copy a 
11190 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20  maximum of nBuf 
111a0 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20  chars to output 
111b0 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
111c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
111d0 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Buf, zBuf, "%s",
111e0 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66   zOut);.    /* f
111f0 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66  ree the UTF8 buf
11200 66 65 72 20 2a 2f 0a 20 20 20 20 66 72 65 65 28  fer */.    free(
11210 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
11220 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
11230 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
11240 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
11250 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
11260 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
11270 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
11280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11290 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
112a0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
112b0 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
112c0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
112d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
112e0 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68  he SQLite file h
112f0 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
11300 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
11310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
11320 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  n mode flags */.
11330 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
11340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11350 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
11360 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c  gs */.){.  HANDL
11370 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  E h;.  DWORD dwD
11380 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
11390 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
113a0 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
113b0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
113c0 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
113d0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
113e0 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   0;.#if SQLITE_O
113f0 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73  S_WINCE.  int is
11400 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Temp = 0;.#endif
11410 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11420 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
11430 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
11440 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
11450 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
11460 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
11470 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11480 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
11490 61 6d 65 3b 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame;    /* Filen
114a0 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63  ame in UTF-8 enc
114b0 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  oding */.  char 
114c0 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
114d0 48 2b 31 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  H+1];        /* 
114e0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63  Buffer used to c
114f0 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e  reate temp filen
11500 61 6d 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ame */..  assert
11510 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55  ( id!=0 );.  UNU
11520 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
11530 66 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68  fs);..  pFile->h
11540 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
11550 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49  E_VALUE;..  /* I
11560 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
11570 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
11580 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
11590 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a  generate a .  **
115a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
115b0 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a  name to use .  *
115c0 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
115d0 6d 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  me ){.    int rc
115e0 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d   = getTempname(M
115f0 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e  AX_PATH+1, zTmpn
11600 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
11610 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11620 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11630 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
11640 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
11650 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72    }..  /* Conver
11660 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
11670 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
11680 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
11690 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
116a0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
116b0 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
116c0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
116d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
116e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
116f0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
11700 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11710 45 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  E ){.    dwDesir
11720 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
11730 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
11740 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
11750 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
11760 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
11770 52 45 41 44 3b 0a 20 20 7d 0a 20 20 2f 2a 20 53  READ;.  }.  /* S
11780 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11790 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
117a0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
117b0 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
117c0 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
117d0 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
117e0 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
117f0 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
11800 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
11810 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
11820 6f 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  od..  */.  asser
11830 74 28 21 28 66 6c 61 67 73 20 26 20 53 51 4c 49  t(!(flags & SQLI
11840 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
11850 45 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  E) || (flags & S
11860 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
11870 45 29 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  E));.  if( flags
11880 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
11890 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
118a0 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77  /* Creates a new
118b0 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
118c0 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
118d0 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  dy exist. */.   
118e0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
118f0 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73  exists, it fails
11900 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
11910 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
11920 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d   CREATE_NEW;.  }
11930 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
11940 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
11950 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ATE ){.    /* Op
11960 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
11970 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
11980 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
11990 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
119a0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
119b0 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
119c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
119d0 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
119e0 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
119f0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
11a00 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
11a10 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 20  _EXISTING;.  }. 
11a20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
11a30 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
11a40 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
11a50 45 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  E;.  if( flags &
11a60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
11a70 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 23 69  ETEONCLOSE ){.#i
11a80 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
11a90 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
11aa0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
11ab0 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
11ac0 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
11ad0 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
11ae0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
11af0 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
11b00 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
11b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
11b30 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
11b40 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b60 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
11b70 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
11b80 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
11b90 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
11ba0 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
11bb0 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
11bc0 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
11bd0 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
11be0 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
11bf0 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
11c00 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
11c10 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
11c20 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
11c30 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
11c40 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
11c50 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
11c60 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
11c70 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
11c80 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
11c90 6e 64 69 66 0a 20 20 69 66 28 20 69 73 4e 54 28  ndif.  if( isNT(
11ca0 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65  ) ){.    h = Cre
11cb0 61 74 65 46 69 6c 65 57 28 28 57 43 48 41 52 2a  ateFileW((WCHAR*
11cc0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
11cd0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
11ce0 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77 53 68  ess,.       dwSh
11cf0 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20  areMode,.       
11d00 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77 43  NULL,.       dwC
11d10 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
11d20 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 6c 61  on,.       dwFla
11d30 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
11d40 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20  .       NULL.   
11d50 20 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73   );./* isNT() is
11d60 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f   1 if SQLITE_OS_
11d70 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69  WINCE==1, so thi
11d80 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20  s else is never 
11d90 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69  executed. .** Si
11da0 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65  nce the ASCII ve
11db0 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57  rsion of these W
11dc0 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f  indows API do no
11dd0 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43  t exist for WINC
11de0 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72  E,.** it's impor
11df0 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65  tant to not refe
11e00 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57  rence them for W
11e10 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a  INCE builds..*/.
11e20 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
11e30 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
11e40 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
11e50 6c 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  leA((char*)zConv
11e60 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77  erted,.       dw
11e70 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
11e80 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
11e90 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a  e,.       NULL,.
11ea0 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
11eb0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
11ec0 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
11ed0 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20  ttributes,.     
11ee0 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 23 65    NULL.    );.#e
11ef0 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ndif.  }.  OSTRA
11f00 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 20  CE(("OPEN %d %s 
11f10 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20  0x%lx %s\n", .  
11f20 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d           h, zNam
11f30 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65  e, dwDesiredAcce
11f40 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ss, .           
11f50 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
11f60 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69 6c 65  E_VALUE ? "faile
11f70 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 69  d" : "ok"));.  i
11f80 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
11f90 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
11fa0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
11fb0 64 29 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 67  d);.    if( flag
11fc0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
11fd0 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20  READWRITE ){.   
11fe0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65     return winOpe
11ff0 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69  n(pVfs, zName, i
12000 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d, .            
12010 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
12020 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 26 7e  OPEN_READONLY)&~
12030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
12040 57 52 49 54 45 29 2c 20 70 4f 75 74 46 6c 61 67  WRITE), pOutFlag
12050 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
12060 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12070 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
12080 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12090 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
120a0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53     if( flags & S
120b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
120c0 52 49 54 45 20 29 7b 0a 20 20 20 20 20 20 2a 70  RITE ){.      *p
120d0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
120e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
120f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12100 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
12110 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
12120 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
12130 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
12140 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65  0, sizeof(*pFile
12150 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ));.  pFile->pMe
12160 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
12170 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  hod;.  pFile->h 
12180 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  = h;.  pFile->la
12190 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
121a0 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  OR;.  pFile->pVf
121b0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
121c0 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70  e->pShm = 0;.  p
121d0 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e  File->zPath = zN
121e0 61 6d 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 73 65  ame;.  pFile->se
121f0 63 74 6f 72 53 69 7a 65 20 3d 20 67 65 74 53 65  ctorSize = getSe
12200 63 74 6f 72 53 69 7a 65 28 70 56 66 73 2c 20 7a  ctorSize(pVfs, z
12210 55 74 66 38 4e 61 6d 65 29 3b 0a 23 69 66 20 53  Utf8Name);.#if S
12220 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
12230 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 53   if( (flags & (S
12240 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
12250 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
12260 5f 4d 41 49 4e 5f 44 42 29 29 20 3d 3d 0a 20 20  _MAIN_DB)) ==.  
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
12280 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12290 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
122a0 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 20 20  MAIN_DB).       
122b0 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c  && !winceCreateL
122c0 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
122d0 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f 73 65  ).  ){.    Close
122e0 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 66  Handle(h);.    f
122f0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
12300 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12310 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
12320 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
12330 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  mp ){.    pFile-
12340 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
12350 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
12360 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
12370 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65  .    free(zConve
12380 72 74 65 64 29 3b 0a 20 20 7d 0a 20 20 4f 70 65  rted);.  }.  Ope
12390 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
123a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
123b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
123c0 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
123d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
123e0 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  t windows does n
123f0 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20  ot allow a file 
12400 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66  to be deleted if
12410 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
12420 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70  rocess has it op
12430 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61  en.  Sometimes a
12440 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f   virus scanner o
12450 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72  r indexing progr
12460 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20  am.** will open 
12470 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  a journal file s
12480 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20  hortly after it 
12490 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
124a0 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61  der to do.** wha
124b0 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20  tever it does.  
124c0 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72  While this other
124d0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
124e0 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
124f0 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65  open, we will be
12500 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74   unable to delet
12510 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61  e it.  To work a
12520 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72  round this.** pr
12530 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20  oblem, we delay 
12540 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
12550 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65   and try to dele
12560 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a  te again.  Up.**
12570 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f   to MX_DELETION_
12580 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f  ATTEMPTs deletio
12590 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72  n attempts are r
125a0 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  un before giving
125b0 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72  .** up and retur
125c0 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
125d0 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 44 45 4c  /.#define MX_DEL
125e0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 35  ETION_ATTEMPTS 5
125f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
12600 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
12610 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
12620 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
12630 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
12640 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12650 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
12660 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
12670 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79  lete */.  int sy
12680 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20  ncDir           
12690 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
126a0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b  d on win32 */.){
126b0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
126c0 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44 57    DWORD rc;.  DW
126d0 4f 52 44 20 65 72 72 6f 72 20 3d 20 30 3b 0a 20  ORD error = 0;. 
126e0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
126f0 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
12700 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
12710 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
12720 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
12730 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12740 28 73 79 6e 63 44 69 72 29 3b 0a 20 20 69 66 28  (syncDir);.  if(
12750 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
12760 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12770 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12780 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12790 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
127a0 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
127b0 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
127c0 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65    do{.      Dele
127d0 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74  teFileW(zConvert
127e0 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ed);.    }while(
127f0 20 20 20 28 20 20 20 28 28 72 63 20 3d 20 47 65     (   ((rc = Ge
12800 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
12810 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20 21 3d  (zConverted)) !=
12820 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
12830 54 52 49 42 55 54 45 53 29 0a 20 20 20 20 20 20  TRIBUTES).      
12840 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 65 72           || ((er
12850 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
12860 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41  or()) == ERROR_A
12870 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29 0a 20  CCESS_DENIED)). 
12880 20 20 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b            && (++
12890 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f  cnt < MX_DELETIO
128a0 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20 20 20  N_ATTEMPTS).    
128b0 20 20 20 20 20 20 20 26 26 20 28 53 6c 65 65 70         && (Sleep
128c0 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 2f 2a 20  (100), 1) );./* 
128d0 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
128e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
128f0 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
12900 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
12910 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
12920 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
12930 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
12940 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
12950 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
12960 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
12970 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
12980 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
12990 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
129a0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
129b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 7b    }else{.    do{
129c0 0a 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c  .      DeleteFil
129d0 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  eA(zConverted);.
129e0 20 20 20 20 7d 77 68 69 6c 65 28 20 20 20 28 20      }while(   ( 
129f0 20 20 28 28 72 63 20 3d 20 47 65 74 46 69 6c 65    ((rc = GetFile
12a00 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
12a10 76 65 72 74 65 64 29 29 20 21 3d 20 49 4e 56 41  verted)) != INVA
12a20 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
12a30 54 45 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  TES).           
12a40 20 20 20 20 7c 7c 20 28 28 65 72 72 6f 72 20 3d      || ((error =
12a50 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
12a60 20 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53   == ERROR_ACCESS
12a70 5f 44 45 4e 49 45 44 29 29 0a 20 20 20 20 20 20  _DENIED)).      
12a80 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 20 3c       && (++cnt <
12a90 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
12aa0 45 4d 50 54 53 29 0a 20 20 20 20 20 20 20 20 20  EMPTS).         
12ab0 20 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29    && (Sleep(100)
12ac0 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  , 1) );.#endif. 
12ad0 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65   }.  free(zConve
12ae0 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
12af0 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  (("DELETE \"%s\"
12b00 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
12b10 65 2c 0a 20 20 20 20 20 20 20 28 20 28 72 63 3d  e,.       ( (rc=
12b20 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
12b30 54 52 49 42 55 54 45 53 29 20 26 26 20 28 65 72  TRIBUTES) && (er
12b40 72 6f 72 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  ror==ERROR_FILE_
12b50 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 0a 20 20  NOT_FOUND)) ?.  
12b60 20 20 20 20 20 20 20 22 6f 6b 22 20 3a 20 22 66         "ok" : "f
12b70 61 69 6c 65 64 22 20 29 29 3b 0a 20 0a 20 20 72  ailed" ));. .  r
12b80 65 74 75 72 6e 20 28 20 20 20 28 72 63 20 3d 3d  eturn (   (rc ==
12b90 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
12ba0 54 52 49 42 55 54 45 53 29 20 0a 20 20 20 20 20  TRIBUTES) .     
12bb0 20 20 20 20 20 26 26 20 28 65 72 72 6f 72 20 3d       && (error =
12bc0 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  = ERROR_FILE_NOT
12bd0 5f 46 4f 55 4e 44 29 29 20 3f 20 53 51 4c 49 54  _FOUND)) ? SQLIT
12be0 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  E_OK : SQLITE_IO
12bf0 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d 0a 0a 2f  ERR_DELETE;.}../
12c00 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65  *.** Check the e
12c10 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61  xistance and sta
12c20 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tus of a file..*
12c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12c40 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
12c50 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
12c60 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
12c70 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
12c80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12c90 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
12ca0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
12cb0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
12cc0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
12cd0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
12ce0 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
12cf0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
12d00 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
12d10 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
12d20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44  Result */.){.  D
12d30 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
12d40 20 72 63 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20   rc = 0;.  void 
12d50 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
12d60 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
12d70 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
12d80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12d90 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43  (pVfs);.  if( zC
12da0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
12db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12dc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
12dd0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
12de0 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74  attr = GetFileAt
12df0 74 72 69 62 75 74 65 73 57 28 28 57 43 48 41 52  tributesW((WCHAR
12e00 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 2f  *)zConverted);./
12e10 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
12e20 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
12e30 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
12e40 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
12e50 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
12e60 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
12e70 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
12e80 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
12e90 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
12ea0 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
12eb0 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
12ec0 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
12ed0 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
12ee0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
12ef0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
12f00 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74 74  ttr = GetFileAtt
12f10 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
12f20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
12f30 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  dif.  }.  free(z
12f40 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
12f50 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
12f60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
12f70 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
12f80 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
12f90 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
12fa0 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
12fb0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
12fc0 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
12fd0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
12fe0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
12ff0 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 28  TE:.      rc = (
13000 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
13010 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
13020 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
13030 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
13040 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
13050 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
13060 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
13070 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  esOut = rc;.  re
13080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13090 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  }.../*.** Turn a
130a0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
130b0 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
130c0 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20  athname.  Write 
130d0 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68  the full.** path
130e0 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d  name into zOut[]
130f0 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62  .  zOut[] will b
13100 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d  e at least pVfs-
13110 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62  >mxPathname.** b
13120 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
13130 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
13140 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
13150 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
13160 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13170 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
13180 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
13190 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65   char *zRelative
131a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73  ,        /* Poss
131b0 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
131c0 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
131d0 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20  t nFull,        
131e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
131f0 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
13200 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
13210 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20  .  char *zFull  
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13230 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
13240 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64  r */.){.  .#if d
13250 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
13260 5f 29 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  _).  UNUSED_PARA
13270 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
13280 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66  cygwin_conv_to_f
13290 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a  ull_win32_path(z
132a0 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29  Relative, zFull)
132b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
132c0 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
132d0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
132e0 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  E.  UNUSED_PARAM
132f0 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f  ETER(nFull);.  /
13300 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
13310 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
13320 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
13330 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
13340 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  */.  sqlite3_snp
13350 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
13360 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
13370 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
13380 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13390 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
133a0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
133b0 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
133c0 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
133d0 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
133e0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
133f0 72 20 2a 7a 4f 75 74 3b 0a 20 20 55 4e 55 53 45  r *zOut;.  UNUSE
13400 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
13410 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  l);.  zConverted
13420 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
13430 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
13440 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  );.  if( isNT() 
13450 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54  ){.    WCHAR *zT
13460 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
13470 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
13480 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
13490 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b  rted, 0, 0, 0) +
134a0 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
134b0 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
134c0 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
134d0 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
134e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
134f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
13500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13510 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
13520 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61     GetFullPathNa
13530 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  meW((WCHAR*)zCon
13540 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
13550 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72  Temp, 0);.    fr
13560 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
13570 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
13580 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b  deToUtf8(zTemp);
13590 0a 20 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29  .    free(zTemp)
135a0 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
135b0 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
135c0 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
135d0 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
135e0 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
135f0 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
13600 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
13610 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
13620 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
13630 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
13640 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
13650 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
13660 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
13670 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13680 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
13690 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20    char *zTemp;. 
136a0 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75     nByte = GetFu
136b0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
136c0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
136d0 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
136e0 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28   zTemp = malloc(
136f0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
13700 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
13710 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
13720 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65       free(zConve
13730 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
13740 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46  ;.    }.    GetF
13760 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
13770 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
13780 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
13790 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  ;.    free(zConv
137a0 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
137b0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
137c0 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
137d0 65 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  emp);.    free(z
137e0 54 65 6d 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Temp);.#endif.  
137f0 7d 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  }.  if( zOut ){.
13800 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
13810 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74  intf(pVfs->mxPat
13820 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25  hname, zFull, "%
13830 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 66  s", zOut);.    f
13840 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72  ree(zOut);.    r
13850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
13870 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13880 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  M;.  }.#endif.}.
13890 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 73  ./*.** Get the s
138a0 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68  ector size of th
138b0 65 20 64 65 76 69 63 65 20 75 73 65 64 20 74 6f  e device used to
138c0 20 73 74 6f 72 65 0a 2a 2a 20 66 69 6c 65 2e 0a   store.** file..
138d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
138e0 74 53 65 63 74 6f 72 53 69 7a 65 28 0a 20 20 20  tSectorSize(.   
138f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
13900 66 73 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  fs,.    const ch
13910 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 20 20 20  ar *zRelative   
13920 20 20 2f 2a 20 55 54 46 2d 38 20 66 69 6c 65 20    /* UTF-8 file 
13930 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  name */.){.  DWO
13940 52 44 20 62 79 74 65 73 50 65 72 53 65 63 74 6f  RD bytesPerSecto
13950 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  r = SQLITE_DEFAU
13960 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
13970 20 20 2f 2a 20 47 65 74 44 69 73 6b 46 72 65 65    /* GetDiskFree
13980 53 70 61 63 65 20 69 73 20 6e 6f 74 20 73 75 70  Space is not sup
13990 70 6f 72 74 65 64 20 75 6e 64 65 72 20 57 49 4e  ported under WIN
139a0 43 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  CE */.#if SQLITE
139b0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55 53  _OS_WINCE.  UNUS
139c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
139d0 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
139e0 41 4d 45 54 45 52 28 7a 52 65 6c 61 74 69 76 65  AMETER(zRelative
139f0 29 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20  );.#else.  char 
13a00 7a 46 75 6c 6c 70 61 74 68 5b 4d 41 58 5f 50 41  zFullpath[MAX_PA
13a10 54 48 2b 31 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  TH+1];.  int rc;
13a20 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 20 3d  .  DWORD dwRet =
13a30 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 75   0;.  DWORD dwDu
13a40 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  mmy;..  /*.  ** 
13a50 57 65 20 6e 65 65 64 20 74 6f 20 67 65 74 20 74  We need to get t
13a60 68 65 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d  he full path nam
13a70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
13a80 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 64 72  ** to get the dr
13a90 69 76 65 20 6c 65 74 74 65 72 20 74 6f 20 6c 6f  ive letter to lo
13aa0 6f 6b 20 75 70 20 74 68 65 20 73 65 63 74 6f 72  ok up the sector
13ab0 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f  .  ** size..  */
13ac0 0a 20 20 72 63 20 3d 20 77 69 6e 46 75 6c 6c 50  .  rc = winFullP
13ad0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 52  athname(pVfs, zR
13ae0 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50 41 54  elative, MAX_PAT
13af0 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20  H, zFullpath);. 
13b00 20 69 66 28 20 72 63 20 3d 3d 20 53 51 4c 49 54   if( rc == SQLIT
13b10 45 5f 4f 4b 20 29 0a 20 20 7b 0a 20 20 20 20 76  E_OK ).  {.    v
13b20 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
13b30 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
13b40 65 6e 61 6d 65 28 7a 46 75 6c 6c 70 61 74 68 29  ename(zFullpath)
13b50 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e 76 65  ;.    if( zConve
13b60 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  rted ){.      if
13b70 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
13b80 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68      /* trim path
13b90 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72   to just drive r
13ba0 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20  eference */.    
13bb0 20 20 20 20 57 43 48 41 52 20 2a 70 20 3d 20 7a      WCHAR *p = z
13bc0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20  Converted;.     
13bd0 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b     for(;*p;p++){
13be0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a  .          if( *
13bf0 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20  p == '\\' ){.   
13c00 20 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27 5c           *p = '\
13c10 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0';.            
13c20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
13c30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
13c40 20 20 20 20 20 64 77 52 65 74 20 3d 20 47 65 74       dwRet = Get
13c50 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 28 28  DiskFreeSpaceW((
13c60 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
13c70 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 26 62 79 74 65 73 50 65 72 53 65 63 74 6f 72   &bytesPerSector
13cd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20      &dwDummy,.  
13d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20  &dwDummy);.     
13d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13d40 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20  /* trim path to 
13d50 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72  just drive refer
13d60 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ence */.        
13d70 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
13d80 2a 29 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  *)zConverted;.  
13d90 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b        for(;*p;p+
13da0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
13db0 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a  ( *p == '\\' ){.
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 20 3d              *p =
13dd0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20   '\0';.         
13de0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13df0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
13e00 20 20 20 20 20 20 20 20 64 77 52 65 74 20 3d 20          dwRet = 
13e10 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
13e20 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
13e30 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
13e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e50 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c         &dwDummy,
13e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e80 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63 74     &bytesPerSect
13e90 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13eb0 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a        &dwDummy,.
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20    &dwDummy);.   
13ef0 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
13f00 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
13f10 20 7d 0a 20 20 20 20 69 66 28 20 21 64 77 52 65   }.    if( !dwRe
13f20 74 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73  t ){.      bytes
13f30 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c 49  PerSector = SQLI
13f40 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
13f50 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 20 20  R_SIZE;.    }.  
13f60 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
13f70 6e 20 28 69 6e 74 29 20 62 79 74 65 73 50 65 72  n (int) bytesPer
13f80 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23 69 66 6e  Sector; .}..#ifn
13f90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13fa0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
13fb0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
13fc0 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
13fd0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
13fe0 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
13ff0 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
14000 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
14010 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
14020 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
14030 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .*/./*.** Interf
14040 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
14050 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
14060 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
14070 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
14080 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
14090 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
140a0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
140b0 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
140c0 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
140d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
140e0 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
140f0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
14100 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
14110 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
14120 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
14130 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
14140 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
14150 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  Vfs);.  if( zCon
14160 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
14170 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
14180 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
14190 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61     h = LoadLibra
141a0 72 79 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e  ryW((WCHAR*)zCon
141b0 76 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54  verted);./* isNT
141c0 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
141d0 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
141e0 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
141f0 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
14200 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43  ** Since the ASC
14210 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  II version of th
14220 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20  ese Windows API 
14230 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72  do not exist for
14240 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20   WINCE,.** it's 
14250 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
14260 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20   reference them 
14270 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73  for WINCE builds
14280 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
14290 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
142a0 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61  lse{.    h = Loa
142b0 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a  dLibraryA((char*
142c0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
142d0 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28  ndif.  }.  free(
142e0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72  zConverted);.  r
142f0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a  eturn (void*)h;.
14300 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
14310 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  nDlError(sqlite3
14320 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
14330 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
14340 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
14350 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
14360 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73    getLastErrorMs
14370 67 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29  g(nBuf, zBufOut)
14380 3b 0a 7d 0a 76 6f 69 64 20 28 2a 77 69 6e 44 6c  ;.}.void (*winDl
14390 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
143a0 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
143b0 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  ndle, const char
143c0 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64   *zSymbol))(void
143d0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
143e0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66  METER(pVfs);.#if
143f0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
14400 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f  .  /* The GetPro
14410 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74  cAddressA() rout
14420 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ine is only avai
14430 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65 2e 20  lable on wince. 
14440 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  */.  return (voi
14450 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72  d(*)(void))GetPr
14460 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44  ocAddressA((HAND
14470 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d  LE)pHandle, zSym
14480 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  bol);.#else.  /*
14490 20 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e 64 6f   All other windo
144a0 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70  ws platforms exp
144b0 65 63 74 20 47 65 74 50 72 6f 63 41 64 64 72 65  ect GetProcAddre
144c0 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a  ss() to take.  *
144d0 2a 20 61 6e 20 41 6e 73 69 20 73 74 72 69 6e 67  * an Ansi string
144e0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
144f0 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74  he _UNICODE sett
14500 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ing */.  return 
14510 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 47  (void(*)(void))G
14520 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 28 48  etProcAddress((H
14530 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a  ANDLE)pHandle, z
14540 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a  Symbol);.#endif.
14550 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  }.void winDlClos
14560 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
14570 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
14580 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
14590 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
145a0 20 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41   FreeLibrary((HA
145b0 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d  NDLE)pHandle);.}
145c0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c  .#else /* if SQL
145d0 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
145e0 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e  TENSION is defin
145f0 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ed: */.  #define
14600 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20   winDlOpen  0.  
14610 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72  #define winDlErr
14620 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  or 0.  #define w
14630 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64  inDlSym   0.  #d
14640 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65  efine winDlClose
14650 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
14660 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42  * Write up to nB
14670 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64  uf bytes of rand
14680 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66  omness into zBuf
14690 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
146a0 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  winRandomness(sq
146b0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
146c0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
146d0 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20  *zBuf){.  int n 
146e0 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
146f0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23  RAMETER(pVfs);.#
14700 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
14710 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42  E_TEST).  n = nB
14720 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75  uf;.  memset(zBu
14730 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c  f, 0, nBuf);.#el
14740 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  se.  if( sizeof(
14750 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75  SYSTEMTIME)<=nBu
14760 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45  f-n ){.    SYSTE
14770 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 47 65 74  MTIME x;.    Get
14780 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a  SystemTime(&x);.
14790 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
147a0 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  [n], &x, sizeof(
147b0 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  x));.    n += si
147c0 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69  zeof(x);.  }.  i
147d0 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
147e0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
147f0 44 57 4f 52 44 20 70 69 64 20 3d 20 47 65 74 43  DWORD pid = GetC
14800 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
14810 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
14820 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69  Buf[n], &pid, si
14830 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
14840 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29  n += sizeof(pid)
14850 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
14860 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
14870 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63  n ){.    DWORD c
14880 6e 74 20 3d 20 47 65 74 54 69 63 6b 43 6f 75 6e  nt = GetTickCoun
14890 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t();.    memcpy(
148a0 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
148b0 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
148c0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
148d0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  t);.  }.  if( si
148e0 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47  zeof(LARGE_INTEG
148f0 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ER)<=nBuf-n ){. 
14900 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
14910 20 69 3b 0a 20 20 20 20 51 75 65 72 79 50 65 72   i;.    QueryPer
14920 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
14930 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
14940 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
14950 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
14960 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
14970 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
14980 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
14990 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
149a0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
149b0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
149c0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
149d0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
149e0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
149f0 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
14a00 63 29 7b 0a 20 20 53 6c 65 65 70 28 28 6d 69 63  c){.  Sleep((mic
14a10 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
14a20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
14a30 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
14a40 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b  turn ((microsec+
14a50 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b  999)/1000)*1000;
14a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
14a70 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
14a80 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
14a90 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
14aa0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
14ab0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
14ac0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
14ad0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
14ae0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
14af0 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
14b00 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
14b10 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
14b20 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14b30 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
14b40 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
14b50 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
14b60 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
14b70 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
14b80 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
14b90 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
14ba0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
14bb0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
14bc0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
14bd0 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
14be0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
14bf0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
14c00 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
14c10 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
14c20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
14c30 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
14c40 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
14c50 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
14c60 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
14c70 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
14c80 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
14c90 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
14ca0 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
14cb0 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
14cc0 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
14cd0 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
14ce0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
14cf0 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
14d00 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
14d10 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
14d20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
14d30 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
14d40 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
14d50 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
14d60 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
14d70 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
14d80 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
14d90 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
14da0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
14db0 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30  mber of .     10
14dc0 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
14dd0 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
14de0 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
14df0 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a  JD 2305813.5). .
14e00 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20    */.  FILETIME 
14e10 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ft;.  static con
14e20 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
14e30 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
14e40 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71  h = 23058135*(sq
14e50 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
14e60 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  000;.#ifdef SQLI
14e70 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
14e80 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
14e90 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
14ea0 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
14eb0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
14ec0 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e  ;.#endif.  /* 2^
14ed0 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73  32 - to avoid us
14ee0 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e  e of LL and warn
14ef0 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20  ings in gcc */. 
14f00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
14f10 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33  lite3_int64 max3
14f20 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20  2BitValue = .   
14f30 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
14f40 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
14f50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
14f60 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
14f70 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
14f80 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
14f90 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
14fa0 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 47  EMTIME time;.  G
14fb0 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
14fc0 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
14fd0 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
14fe0 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
14ff0 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
15000 20 69 66 20 28 21 53 79 73 74 65 6d 54 69 6d 65   if (!SystemTime
15010 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65  ToFileTime(&time
15020 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75  ,&ft)){.    retu
15030 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  rn 1;.  }.#else.
15040 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41    GetSystemTimeA
15050 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29  sFileTime( &ft )
15060 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e  ;.#endif..  *piN
15070 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65  ow = winFiletime
15080 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20  Epoch +.        
15090 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f      ((((sqlite3_
150a0 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44  int64)ft.dwHighD
150b0 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69  ateTime)*max32Bi
150c0 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20  tValue) + .     
150d0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
150e0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
150f0 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
15100 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 3b 0a  te3_int64)1000;.
15110 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
15120 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
15130 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
15140 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
15150 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
15160 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
15170 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
15180 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
15190 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
151a0 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
151b0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn 0;.}../*.** F
151c0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
151d0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
151e0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
151f0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
15200 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
15210 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
15220 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
15230 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
15240 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
15250 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
15260 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
15270 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
15280 0a 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54  .int winCurrentT
15290 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
152a0 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
152b0 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
152c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
152d0 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
152e0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
152f0 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
15300 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
15310 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
15320 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15330 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
15340 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
15350 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
15360 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
15370 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
15380 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
15390 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
153a0 77 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  windows (or errn
153b0 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
153c0 72 5f 72 28 29 20 6f 6e 20 75 6e 69 78 29 2e 20  r_r() on unix). 
153d0 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
153e0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
153f0 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
15400 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
15410 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
15420 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
15430 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
15440 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
15450 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
15460 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
15470 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
15480 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
15490 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
154a0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
154b0 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
154c0 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
154d0 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
154e0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
154f0 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
15500 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
15510 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
15520 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
15530 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
15540 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
15550 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
15560 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
15570 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
15580 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
15590 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
155a0 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
155b0 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
155c0 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
155d0 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
155e0 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
155f0 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
15600 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
15610 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
15620 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
15630 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
15640 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
15650 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
15660 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
15670 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
15680 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
15690 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
156a0 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
156b0 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
156c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
156d0 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
156e0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
156f0 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
15700 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
15710 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
15720 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
15730 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
15740 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
15750 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
15760 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
15770 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
15780 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15790 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
157a0 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
157b0 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
157c0 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
157d0 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
157e0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
157f0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
15800 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
15810 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
15820 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
15830 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
15840 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
15850 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
15860 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
15870 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
15880 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
15890 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
158a0 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  n getLastErrorMs
158b0 67 28 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d  g(nBuf, zBuf);.}
158c0 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  ..../*.** Initia
158d0 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69  lize and deiniti
158e0 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74  alize the operat
158f0 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72  ing system inter
15900 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  face..*/.int sql
15910 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
15920 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
15930 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20  ite3_vfs winVfs 
15940 3d 20 7b 0a 20 20 20 20 32 2c 20 20 20 20 20 20  = {.    2,      
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15960 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
15970 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
15980 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
15990 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48   */.    MAX_PATH
159a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
159b0 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
159c0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
159d0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
159e0 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
159f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
15a00 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Name */.    0,  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
15a30 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
15a40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
15a50 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65  n */.    winDele
15a60 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
15a70 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
15a80 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
15a90 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
15aa0 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
15ab0 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78  thname,     /* x
15ac0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
15ad0 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
15ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
15af0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
15b00 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
15b10 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
15b20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
15b30 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
15b40 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
15b50 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
15b60 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
15b70 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
15b80 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d        /* xRandom
15b90 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53  ness */.    winS
15ba0 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
15bb0 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
15bc0 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
15bd0 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65  ,      /* xCurre
15be0 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
15bf0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
15c00 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
15c10 72 6f 72 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ror */.    0,   
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20  /* xRename */.  
15c40 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
15c50 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
15c60 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
15c70 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   };..  sqlite3_v
15c80 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
15c90 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  Vfs, 1);.  retur
15ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a  n SQLITE_OK; .}.
15cb0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65  int sqlite3_os_e
15cc0 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74  nd(void){ .  ret
15cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15ce0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
15cf0 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.