/ Hex Artifact Content
Login

Artifact e300c8f85c1be853f977e50f9292e61a396e6a33:


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 51 75 65 72 79 20 61  }../*.** Query a
d070: 6e 64 2f 6f 72 20 63 68 61 6e 67 65 73 20 74 68  nd/or changes th
d080: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 75 6e  e size of the un
d090: 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65  derlying storage
d0a0: 20 66 6f 72 0a 2a 2a 20 61 20 73 68 61 72 65 64   for.** a shared
d0b0: 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
d0c0: 20 20 54 68 65 20 72 65 71 53 69 7a 65 20 70 61    The reqSize pa
d0d0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
d0e0: 65 77 20 73 69 7a 65 0a 2a 2a 20 6f 66 20 74 68  ew size.** of th
d0f0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f  e underlying sto
d100: 72 61 67 65 2c 20 6f 72 20 2d 31 20 74 6f 20 64  rage, or -1 to d
d110: 6f 20 6a 75 73 74 20 61 20 71 75 65 72 79 2e 20  o just a query. 
d120: 20 54 68 65 20 73 69 7a 65 0a 2a 2a 20 6f 66 20   The size.** of 
d130: 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  the underlying s
d140: 74 6f 72 61 67 65 20 28 61 66 74 65 72 20 72 65  torage (after re
d150: 73 69 7a 69 6e 67 20 69 66 20 72 65 73 69 7a 69  sizing if resizi
d160: 6e 67 20 6f 63 63 75 72 73 29 20 69 73 0a 2a 2a  ng occurs) is.**
d170: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 4e   written into pN
d180: 65 77 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ewSize..**.** Th
d190: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
d1a0: 6e 6f 74 20 28 6e 65 63 65 73 73 61 72 69 6c 79  not (necessarily
d1b0: 29 20 63 68 61 6e 67 65 20 74 68 65 20 73 69 7a  ) change the siz
d1c0: 65 20 6f 66 20 74 68 65 20 6d 61 70 70 69 6e 67  e of the mapping
d1d0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 75 6e 64 65   .** of the unde
d1e0: 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 20 69  rlying storage i
d1f0: 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 55 73 65  nto memory.  Use
d200: 20 78 53 68 6d 47 65 74 28 29 20 74 6f 20 63 68   xShmGet() to ch
d210: 61 6e 67 65 0a 2a 2a 20 74 68 65 20 6d 61 70 70  ange.** the mapp
d220: 69 6e 67 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  ing size..**.** 
d230: 54 68 65 20 72 65 71 53 69 7a 65 20 70 61 72 61  The reqSize para
d240: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6d 69 6e  meter is the min
d250: 69 6d 75 6d 20 73 69 7a 65 20 72 65 71 75 65 73  imum size reques
d260: 74 65 64 2e 20 20 54 68 65 20 69 6d 70 6c 65 6d  ted.  The implem
d270: 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 69 73 20 66  entation.** is f
d280: 72 65 65 20 74 6f 20 65 78 70 61 6e 64 20 74 68  ree to expand th
d290: 65 20 73 74 6f 72 61 67 65 20 74 6f 20 73 6f 6d  e storage to som
d2a0: 65 20 6c 61 72 67 65 72 20 61 6d 6f 75 6e 74 20  e larger amount 
d2b0: 69 66 20 69 74 20 63 68 6f 6f 73 65 73 2e 0a 2a  if it chooses..*
d2c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
d2d0: 53 68 6d 53 69 7a 65 28 0a 20 20 73 71 6c 69 74  ShmSize(.  sqlit
d2e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
d2f0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
d300: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
d310: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
d320: 69 6e 74 20 72 65 71 53 69 7a 65 2c 20 20 20 20  int reqSize,    
d330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
d340: 75 65 73 74 65 64 20 73 69 7a 65 2e 20 20 2d 31  uested size.  -1
d350: 20 66 6f 72 20 71 75 65 72 79 20 6f 6e 6c 79 20   for query only 
d360: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 65 77 53 69  */.  int *pNewSi
d370: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze             /
d380: 2a 20 57 72 69 74 65 20 6e 65 77 20 73 69 7a 65  * Write new size
d390: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 77 69   here */.){.  wi
d3a0: 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
d3b0: 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77  winFile*)fd;.  w
d3c0: 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
d3d0: 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d  ->pShm;.  winShm
d3e0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
d3f0: 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20   p->pShmNode;.  
d400: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d410: 4f 4b 3b 0a 0a 20 20 2a 70 4e 65 77 53 69 7a 65  OK;..  *pNewSize
d420: 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 65 71 53   = 0;.  if( reqS
d430: 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  ize>=0 ){.    sq
d440: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
d450: 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
d460: 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
d470: 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
d480: 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20  hFile, &sz);.   
d490: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
d4a0: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 71 53  rc ){.      reqS
d4b0: 69 7a 65 20 3d 20 28 72 65 71 53 69 7a 65 20 2b  ize = (reqSize +
d4c0: 20 53 51 4c 49 54 45 5f 57 49 4e 5f 53 48 4d 5f   SQLITE_WIN_SHM_
d4d0: 49 4e 43 52 20 2d 20 31 29 2f 53 51 4c 49 54 45  INCR - 1)/SQLITE
d4e0: 5f 57 49 4e 5f 53 48 4d 5f 49 4e 43 52 3b 0a 20  _WIN_SHM_INCR;. 
d4f0: 20 20 20 20 20 72 65 71 53 69 7a 65 20 2a 3d 20       reqSize *= 
d500: 53 51 4c 49 54 45 5f 57 49 4e 5f 53 48 4d 5f 49  SQLITE_WIN_SHM_I
d510: 4e 43 52 3b 0a 20 20 20 20 20 20 69 66 28 20 72  NCR;.      if( r
d520: 65 71 53 69 7a 65 3e 73 7a 20 29 7b 0a 20 20 20  eqSize>sz ){.   
d530: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
d540: 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
d550: 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
d560: 3e 68 46 69 6c 65 2c 20 72 65 71 53 69 7a 65 29  >hFile, reqSize)
d570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d580: 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
d590: 5f 4f 4b 3d 3d 72 63 20 29 7b 0a 20 20 20 20 73  _OK==rc ){.    s
d5a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
d5b0: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
d5c0: 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
d5d0: 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
d5e0: 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20  >hFile, &sz);.  
d5f0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
d600: 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 2a 70 4e  =rc ){.      *pN
d610: 65 77 53 69 7a 65 20 3d 20 28 69 6e 74 29 73 7a  ewSize = (int)sz
d620: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d630: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
d640: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
d650: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d660: 0a 2f 2a 0a 2a 2a 20 4d 61 70 20 74 68 65 20 73  ./*.** Map the s
d670: 68 61 72 65 64 20 73 74 6f 72 61 67 65 20 69 6e  hared storage in
d680: 74 6f 20 6d 65 6d 6f 72 79 2e 20 20 54 68 65 20  to memory.  The 
d690: 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  minimum size of 
d6a0: 74 68 65 0a 2a 2a 20 6d 61 70 70 69 6e 67 20 73  the.** mapping s
d6b0: 68 6f 75 6c 64 20 62 65 20 72 65 71 4d 61 70 53  hould be reqMapS
d6c0: 69 7a 65 20 69 66 20 72 65 71 4d 61 70 53 69 7a  ize if reqMapSiz
d6d0: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 20  e is positive.  
d6e0: 49 66 0a 2a 2a 20 72 65 71 4d 61 70 53 69 7a 65  If.** reqMapSize
d6f0: 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
d700: 74 69 76 65 2c 20 74 68 65 20 69 6d 70 6c 65 6d  tive, the implem
d710: 65 6e 74 61 74 69 6f 6e 20 63 61 6e 20 63 68 6f  entation can cho
d720: 6f 73 65 0a 2a 2a 20 77 68 61 74 65 76 65 72 20  ose.** whatever 
d730: 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 69 73 20  mapping size is 
d740: 63 6f 6e 76 65 6e 69 65 6e 74 2e 0a 2a 2a 0a 2a  convenient..**.*
d750: 2a 20 2a 70 70 42 75 66 20 69 73 20 6d 61 64 65  * *ppBuf is made
d760: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
d770: 20 6d 65 6d 6f 72 79 20 77 68 69 63 68 20 69 73   memory which is
d780: 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68   a mapping of th
d790: 65 0a 2a 2a 20 75 6e 64 65 72 6c 79 69 6e 67 20  e.** underlying 
d7a0: 73 74 6f 72 61 67 65 2e 20 20 41 20 6d 75 74 65  storage.  A mute
d7b0: 78 20 69 73 20 61 63 71 75 69 72 65 64 20 74 6f  x is acquired to
d7c0: 20 70 72 65 76 65 6e 74 20 6f 74 68 65 72 20 74   prevent other t
d7d0: 68 72 65 61 64 73 0a 2a 2a 20 66 72 6f 6d 20 72  hreads.** from r
d7e0: 75 6e 6e 69 6e 67 20 77 68 69 6c 65 20 2a 70 70  unning while *pp
d7f0: 42 75 66 20 69 73 20 69 6e 20 75 73 65 20 69 6e  Buf is in use in
d800: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
d810: 74 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 0a  t other threads.
d820: 2a 2a 20 72 65 6d 61 70 70 69 6e 67 20 2a 70 70  ** remapping *pp
d830: 42 75 66 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  Buf out from und
d840: 65 72 20 74 68 69 73 20 74 68 72 65 61 64 2e 20  er this thread. 
d850: 20 54 68 65 20 77 69 6e 53 68 6d 52 65 6c 65 61   The winShmRelea
d860: 73 65 28 29 0a 2a 2a 20 63 61 6c 6c 20 77 69 6c  se().** call wil
d870: 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75  l release the mu
d880: 74 65 78 2e 20 20 48 6f 77 65 76 65 72 2c 20 69  tex.  However, i
d890: 66 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  f the lock state
d8a0: 20 69 73 20 43 48 45 43 4b 50 4f 49 4e 54 2c 0a   is CHECKPOINT,.
d8b0: 2a 2a 20 74 68 65 20 6d 75 74 65 78 20 69 73 20  ** the mutex is 
d8c0: 6e 6f 74 20 61 63 71 75 69 72 65 64 20 62 65 63  not acquired bec
d8d0: 61 75 73 65 20 43 48 45 43 4b 50 4f 49 4e 54 20  ause CHECKPOINT 
d8e0: 77 69 6c 6c 20 6e 65 76 65 72 20 72 65 6d 61 70  will never remap
d8f0: 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2e 20   the.** buffer. 
d900: 20 52 45 43 4f 56 45 52 20 6d 69 67 68 74 20 72   RECOVER might r
d910: 65 6d 61 70 2c 20 74 68 6f 75 67 68 2c 20 73 6f  emap, though, so
d920: 20 43 48 45 43 4b 50 4f 49 4e 54 20 77 69 6c 6c   CHECKPOINT will
d930: 20 61 63 71 75 69 72 65 0a 2a 2a 20 74 68 65 20   acquire.** the 
d940: 6d 75 74 65 78 20 69 66 20 61 6e 64 20 77 68 65  mutex if and whe
d950: 6e 20 69 74 20 70 72 6f 6d 6f 74 65 73 20 74 6f  n it promotes to
d960: 20 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a 20   RECOVER..**.** 
d970: 52 45 43 4f 56 45 52 20 6e 65 65 64 73 20 74 6f  RECOVER needs to
d980: 20 62 65 20 61 74 6f 6d 69 63 2e 20 20 54 68 65   be atomic.  The
d990: 20 73 61 6d 65 20 6d 75 74 65 78 20 74 68 61 74   same mutex that
d9a0: 20 70 72 65 76 65 6e 74 73 20 2a 70 70 42 75 66   prevents *ppBuf
d9b0: 20 66 72 6f 6d 0a 2a 2a 20 62 65 69 6e 67 20 72   from.** being r
d9c0: 65 6d 61 70 70 65 64 20 61 6c 73 6f 20 70 72 65  emapped also pre
d9d0: 76 65 6e 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  vents more than 
d9e0: 6f 6e 65 20 74 68 72 65 61 64 20 66 72 6f 6d 20  one thread from 
d9f0: 62 65 69 6e 67 20 69 6e 0a 2a 2a 20 52 45 43 4f  being in.** RECO
da00: 56 45 52 20 61 74 20 61 20 74 69 6d 65 2e 20 20  VER at a time.  
da10: 42 75 74 2c 20 52 45 43 4f 56 45 52 20 73 6f 6d  But, RECOVER som
da20: 65 74 69 6d 65 73 20 77 61 6e 74 73 20 74 6f 20  etimes wants to 
da30: 72 65 6d 61 70 20 69 74 73 65 6c 66 2e 0a 2a 2a  remap itself..**
da40: 20 54 6f 20 70 72 65 76 65 6e 74 20 52 45 43 4f   To prevent RECO
da50: 56 45 52 20 66 72 6f 6d 20 6c 6f 73 69 6e 67 20  VER from losing 
da60: 69 74 73 20 6c 6f 63 6b 20 77 68 69 6c 65 20 72  its lock while r
da70: 65 6d 61 70 70 69 6e 67 2c 20 74 68 65 0a 2a 2a  emapping, the.**
da80: 20 6d 75 74 65 78 20 69 73 20 6e 6f 74 20 72 65   mutex is not re
da90: 6c 65 61 73 65 64 20 62 79 20 77 69 6e 53 68 6d  leased by winShm
daa0: 52 65 6c 65 61 73 65 28 29 20 77 68 65 6e 20 69  Release() when i
dab0: 6e 20 52 45 43 4f 56 45 52 2e 0a 2a 2a 0a 2a 2a  n RECOVER..**.**
dac0: 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 69 73   *pNewMapSize is
dad0: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
dae0: 20 6f 66 20 74 68 65 20 6d 61 70 70 69 6e 67 2e   of the mapping.
daf0: 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66 20 61 6e  .**.** *ppBuf an
db00: 64 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 20 6d  d *pNewMapSize m
db10: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 61 6e 64  ight be NULL and
db20: 20 7a 65 72 6f 20 69 66 20 6e 6f 20 73 70 61 63   zero if no spac
db30: 65 20 68 61 73 0a 2a 2a 20 79 65 74 20 62 65 65  e has.** yet bee
db40: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 74  n allocated to t
db50: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 74  he underlying st
db60: 6f 72 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  orage..*/.static
db70: 20 69 6e 74 20 77 69 6e 53 68 6d 47 65 74 28 0a   int winShmGet(.
db80: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
db90: 66 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  fd,        /* Th
dba0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
dbb0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
dbc0: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
dbd0: 6e 74 20 72 65 71 4d 61 70 53 69 7a 65 2c 20 20  nt reqMapSize,  
dbe0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65          /* Reque
dbf0: 73 74 65 64 20 73 69 7a 65 20 6f 66 20 6d 61 70  sted size of map
dc00: 70 69 6e 67 2e 20 2d 31 20 6d 65 61 6e 73 20 64  ping. -1 means d
dc10: 6f 6e 27 74 20 63 61 72 65 20 2a 2f 0a 20 20 69  on't care */.  i
dc20: 6e 74 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65 2c  nt *pNewMapSize,
dc30: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dc40: 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 6d 61 70   new size of map
dc50: 70 69 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20 76  ping here */.  v
dc60: 6f 69 64 20 2a 2a 70 70 42 75 66 20 20 20 20 20  oid **ppBuf     
dc70: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
dc80: 20 6d 61 70 70 69 6e 67 20 62 75 66 66 65 72 20   mapping buffer 
dc90: 6f 72 69 67 69 6e 20 68 65 72 65 20 2a 2f 0a 29  origin here */.)
dca0: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
dcb0: 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
dcc0: 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  d;.  winShm *p =
dcd0: 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
dce0: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
dcf0: 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
dd00: 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
dd10: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
dd20: 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 21 3d 53   p->lockState!=S
dd30: 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50  QLITE_SHM_CHECKP
dd40: 4f 49 4e 54 20 26 26 20 70 2d 3e 68 61 73 4d 75  OINT && p->hasMu
dd50: 74 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  texBuf==0 ){.   
dd60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
dd70: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
dd80: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
dd90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
dda0: 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
ddb0: 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a  ode->mutexBuf);.
ddc0: 20 20 20 20 70 2d 3e 68 61 73 4d 75 74 65 78 42      p->hasMutexB
ddd0: 75 66 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  uf = 1;.  }.  sq
dde0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ddf0: 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
de00: 78 29 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  x);.  if( pShmNo
de10: 64 65 2d 3e 73 7a 4d 61 70 3d 3d 30 20 7c 7c 20  de->szMap==0 || 
de20: 72 65 71 4d 61 70 53 69 7a 65 3e 70 53 68 6d 4e  reqMapSize>pShmN
de30: 6f 64 65 2d 3e 73 7a 4d 61 70 20 29 7b 0a 20 20  ode->szMap ){.  
de40: 20 20 69 6e 74 20 61 63 74 75 61 6c 53 69 7a 65    int actualSize
de50: 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  ;.    if( winShm
de60: 53 69 7a 65 28 66 64 2c 20 2d 31 2c 20 26 61 63  Size(fd, -1, &ac
de70: 74 75 61 6c 53 69 7a 65 29 3d 3d 53 51 4c 49 54  tualSize)==SQLIT
de80: 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 72 65 71  E_OK.     && req
de90: 4d 61 70 53 69 7a 65 3c 61 63 74 75 61 6c 53 69  MapSize<actualSi
dea0: 7a 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ze.    ){.      
deb0: 72 65 71 4d 61 70 53 69 7a 65 20 3d 20 61 63 74  reqMapSize = act
dec0: 75 61 6c 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ualSize;.    }. 
ded0: 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
dee0: 3e 70 4d 4d 61 70 42 75 66 20 29 7b 0a 20 20 20  >pMMapBuf ){.   
def0: 20 20 20 69 66 28 20 21 55 6e 6d 61 70 56 69 65     if( !UnmapVie
df00: 77 4f 66 46 69 6c 65 28 70 53 68 6d 4e 6f 64 65  wOfFile(pShmNode
df10: 2d 3e 70 4d 4d 61 70 42 75 66 29 20 29 7b 0a 20  ->pMMapBuf) ){. 
df20: 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
df30: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
df40: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
df50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
df60: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a  _IOERR;.      }.
df70: 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c        CloseHandl
df80: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 4d 61 70  e(pShmNode->hMap
df90: 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
dfa0: 65 2d 3e 68 4d 61 70 20 3d 20 49 4e 56 41 4c 49  e->hMap = INVALI
dfb0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
dfc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51      }.    if( SQ
dfd0: 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 20 29 7b  LITE_OK == rc ){
dfe0: 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
dff0: 3e 70 4d 4d 61 70 42 75 66 20 3d 20 30 3b 0a 20  >pMMapBuf = 0;. 
e000: 20 20 20 20 20 69 66 28 20 72 65 71 4d 61 70 53       if( reqMapS
e010: 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ize == 0 ){.    
e020: 20 20 20 20 2f 2a 20 63 61 6e 27 74 20 63 72 65      /* can't cre
e030: 61 74 65 20 30 20 62 79 74 65 20 66 69 6c 65 20  ate 0 byte file 
e040: 6d 61 70 70 69 6e 67 20 69 6e 20 57 69 6e 64 6f  mapping in Windo
e050: 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53  ws */.        pS
e060: 68 6d 4e 6f 64 65 2d 3e 73 7a 4d 61 70 20 3d 20  hmNode->szMap = 
e070: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
e080: 20 20 20 20 20 20 20 20 2f 2a 20 63 72 65 61 74          /* creat
e090: 65 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69  e the file mappi
e0a0: 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  ng object */.   
e0b0: 20 20 20 20 20 69 66 28 20 49 4e 56 41 4c 49 44       if( INVALID
e0c0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3d 3d  _HANDLE_VALUE ==
e0d0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 4d 61 70 20   pShmNode->hMap 
e0e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
e0f0: 54 42 44 20 70 72 6f 76 69 64 65 20 61 6e 20 6f  TBD provide an o
e100: 62 6a 65 63 74 20 6e 61 6d 65 20 74 6f 20 65 61  bject name to ea
e110: 63 68 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  ch file.        
e120: 20 20 2a 2a 20 6d 61 70 70 69 6e 67 20 73 6f 20    ** mapping so 
e130: 69 74 20 63 61 6e 20 62 65 20 72 65 2d 75 73 65  it can be re-use
e140: 64 20 61 63 72 6f 73 73 20 70 72 6f 63 65 73 73  d across process
e150: 65 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  es..          */
e160: 0a 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e  .          pShmN
e170: 6f 64 65 2d 3e 68 4d 61 70 20 3d 20 43 72 65 61  ode->hMap = Crea
e180: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53  teFileMapping(pS
e190: 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
e1a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
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 4e 55 4c 4c 2c             NULL,
e1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
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 50 41 47 45 5f             PAGE_
e200: 52 45 41 44 57 52 49 54 45 2c 0a 20 20 20 20 20  READWRITE,.     
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
e240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 72 65 71 4d 61 70 53 69 7a 65 2c 0a 20 20    reqMapSize,.  
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20          NULL);. 
e2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e2b0: 20 69 66 28 20 4e 55 4c 4c 3d 3d 70 53 68 6d 4e   if( NULL==pShmN
e2c0: 6f 64 65 2d 3e 68 4d 61 70 20 29 7b 0a 20 20 20  ode->hMap ){.   
e2d0: 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
e2e0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
e2f0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
e300: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e310: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
e320: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
e330: 4d 61 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Map = 0;.       
e340: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 4d 61     pShmNode->hMa
e350: 70 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  p = INVALID_HAND
e360: 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 20 20  LE_VALUE;.      
e370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e380: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d     pShmNode->pMM
e390: 61 70 42 75 66 20 3d 20 4d 61 70 56 69 65 77 4f  apBuf = MapViewO
e3a0: 66 46 69 6c 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  fFile(pShmNode->
e3b0: 68 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20  hMap,.          
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
e3f0: 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 72 65 71 4d 61 70 53 69 7a 65 29 3b      reqMapSize);
e490: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
e4a0: 70 53 68 6d 4e 6f 64 65 2d 3e 70 4d 4d 61 70 42  pShmNode->pMMapB
e4b0: 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  uf ){.          
e4c0: 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
e4d0: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
e4e0: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
e4f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e500: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20  IOERR;.         
e510: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 4d     pShmNode->szM
e520: 61 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ap = 0;.        
e530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e540: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
e550: 7a 4d 61 70 20 3d 20 72 65 71 4d 61 70 53 69 7a  zMap = reqMapSiz
e560: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
e570: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 4e  .    }.  }.  *pN
e590: 65 77 4d 61 70 53 69 7a 65 20 3d 20 70 53 68 6d  ewMapSize = pShm
e5a0: 4e 6f 64 65 2d 3e 73 7a 4d 61 70 3b 0a 20 20 2a  Node->szMap;.  *
e5b0: 70 70 42 75 66 20 3d 20 70 53 68 6d 4e 6f 64 65  ppBuf = pShmNode
e5c0: 2d 3e 70 4d 4d 61 70 42 75 66 3b 0a 20 20 73 71  ->pMMapBuf;.  sq
e5d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e5e0: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
e5f0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
e600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
e610: 65 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  e the lock held 
e620: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  on the shared me
e630: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 73 6f 20  mory segment so 
e640: 74 68 61 74 20 6f 74 68 65 72 0a 2a 2a 20 74 68  that other.** th
e650: 72 65 61 64 73 20 61 72 65 20 66 72 65 65 20 74  reads are free t
e660: 6f 20 72 65 73 69 7a 65 20 69 74 20 69 66 20 6e  o resize it if n
e670: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
e680: 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6e  If the lock is n
e690: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ot currently hel
e6a0: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
e6b0: 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
e6c0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
e6d0: 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
e6e0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 20 6c 6f 63  object is in loc
e6f0: 6b 20 73 74 61 74 65 20 52 45 43 4f 56 45 52 2c  k state RECOVER,
e700: 20 74 68 65 6e 20 77 65 20 64 6f 20 6e 6f 74 0a   then we do not.
e710: 2a 2a 20 72 65 61 6c 6c 79 20 77 61 6e 74 20 74  ** really want t
e720: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  o release the lo
e730: 63 6b 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63  ck, so in that c
e740: 61 73 65 20 74 6f 6f 2c 20 74 68 69 73 20 72 6f  ase too, this ro
e750: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f  utine.** is a no
e760: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
e770: 6e 74 20 77 69 6e 53 68 6d 52 65 6c 65 61 73 65  nt winShmRelease
e780: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
e790: 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
e7a0: 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
e7b0: 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
e7c0: 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
e7d0: 20 20 69 66 28 20 70 2d 3e 68 61 73 4d 75 74 65    if( p->hasMute
e7e0: 78 42 75 66 20 26 26 20 70 2d 3e 6c 6f 63 6b 53  xBuf && p->lockS
e7f0: 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d  tate!=SQLITE_SHM
e800: 5f 52 45 43 4f 56 45 52 20 29 7b 0a 20 20 20 20  _RECOVER ){.    
e810: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
e820: 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
e830: 64 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  de;.    assert( 
e840: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
e850: 74 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  theld(pShmNode->
e860: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
e870: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e880: 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
e890: 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e 68 61  xBuf);.    p->ha
e8a0: 73 4d 75 74 65 78 42 75 66 20 3d 20 30 3b 0a 20  sMutexBuf = 0;. 
e8b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
e8c0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e8d0: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 66  Symbolic names f
e8e0: 6f 72 20 4c 4f 43 4b 20 73 74 61 74 65 73 20 75  or LOCK states u
e8f0: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
e900: 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
e910: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
e920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 4c   const char *azL
e930: 6b 4e 61 6d 65 5b 5d 20 3d 20 7b 0a 20 20 22 55  kName[] = {.  "U
e940: 4e 4c 4f 43 4b 22 2c 0a 20 20 22 52 45 41 44 22  NLOCK",.  "READ"
e950: 2c 0a 20 20 22 52 45 41 44 5f 46 55 4c 4c 22 2c  ,.  "READ_FULL",
e960: 0a 20 20 22 57 52 49 54 45 22 2c 0a 20 20 22 50  .  "WRITE",.  "P
e970: 45 4e 44 49 4e 47 22 2c 0a 20 20 22 43 48 45 43  ENDING",.  "CHEC
e980: 4b 50 4f 49 4e 54 22 2c 0a 20 20 22 52 45 43 4f  KPOINT",.  "RECO
e990: 56 45 52 22 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a  VER".};.#endif..
e9a0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
e9b0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
e9c0: 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
e9d0: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
e9e0: 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
e9f0: 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
ea00: 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
ea10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
ea20: 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
ea30: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
ea40: 64 65 73 69 72 65 64 4c 6f 63 6b 2c 20 20 20 20  desiredLock,    
ea50: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
ea60: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 78 78 78 78   SQLITE_SHM_xxxx
ea70: 78 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 73  x locking states
ea80: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 47 6f 74 4c   */.  int *pGotL
ea90: 6f 63 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ock             
eaa0: 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 79 6f 75   /* The lock you
eab0: 20 61 63 74 75 61 6c 6c 79 20 67 6f 74 20 2a 2f   actually got */
eac0: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
ead0: 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
eae0: 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
eaf0: 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
eb00: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
eb10: 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
eb20: 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
eb30: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
eb40: 3b 0a 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61  ;..  /* Note tha
eb50: 74 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  t SQLITE_SHM_REA
eb60: 44 5f 46 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  D_FULL and SQLIT
eb70: 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47 20 61 72  E_SHM_PENDING ar
eb80: 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 64 69 72  e never.  ** dir
eb90: 65 63 74 6c 79 20 72 65 71 75 65 73 74 65 64 3b  ectly requested;
eba0: 20 74 68 65 79 20 61 72 65 20 73 69 64 65 20 65   they are side e
ebb0: 66 66 65 63 74 73 20 66 72 6f 6d 20 72 65 71 75  ffects from requ
ebc0: 65 73 74 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 49  esting.  ** SQLI
ebd0: 54 45 5f 53 48 4d 5f 52 45 41 44 20 61 6e 64 20  TE_SHM_READ and 
ebe0: 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b  SQLITE_SHM_CHECK
ebf0: 50 4f 49 4e 54 2c 20 72 65 73 70 65 63 74 69 76  POINT, respectiv
ec00: 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ely..  */.  asse
ec10: 72 74 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d  rt( desiredLock=
ec20: 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  =SQLITE_SHM_UNLO
ec30: 43 4b 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73  CK.       || des
ec40: 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
ec50: 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20 20 20 20  _SHM_READ.      
ec60: 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d   || desiredLock=
ec70: 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 57 52 49 54  =SQLITE_SHM_WRIT
ec80: 45 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73 69  E.       || desi
ec90: 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f  redLock==SQLITE_
eca0: 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 0a 20  SHM_CHECKPOINT. 
ecb0: 20 20 20 20 20 20 7c 7c 20 64 65 73 69 72 65 64        || desired
ecc0: 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d  Lock==SQLITE_SHM
ecd0: 5f 52 45 43 4f 56 45 52 20 29 3b 0a 0a 20 20 2f  _RECOVER );..  /
ece0: 2a 20 52 65 74 75 72 6e 20 64 69 72 65 63 74 6c  * Return directl
ecf0: 79 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  y if this is jus
ed00: 74 20 61 20 6c 6f 63 6b 20 73 74 61 74 65 20 71  t a lock state q
ed10: 75 65 72 79 2c 20 6f 72 20 69 66 0a 20 20 2a 2a  uery, or if.  **
ed20: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
ed30: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
ed40: 65 20 64 65 73 69 72 65 64 20 6c 6f 63 6b 69 6e  e desired lockin
ed50: 67 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  g state..  */.  
ed60: 69 66 28 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d  if( desiredLock=
ed70: 3d 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 0a 20 20  =p->lockState.  
ed80: 20 7c 7c 20 28 64 65 73 69 72 65 64 4c 6f 63 6b   || (desiredLock
ed90: 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41  ==SQLITE_SHM_REA
eda0: 44 20 26 26 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  D && p->lockStat
edb0: 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  e==SQLITE_SHM_RE
edc0: 41 44 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20  AD_FULL).  ){.  
edd0: 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
ede0: 4c 4f 43 4b 20 25 64 20 73 68 6d 69 64 2d 25 64  LOCK %d shmid-%d
edf0: 2c 20 70 69 64 2d 25 64 20 72 65 71 75 65 73 74  , pid-%d request
ee00: 20 25 73 20 61 6e 64 20 67 6f 74 20 25 73 5c 6e   %s and got %s\n
ee10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ee20: 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
ee30: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
ee40: 70 2d 3e 69 64 2c 20 28 69 6e 74 29 47 65 74 43  p->id, (int)GetC
ee50: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
ee60: 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65 73 69  ), azLkName[desi
ee70: 72 65 64 4c 6f 63 6b 5d 2c 0a 20 20 20 20 20 20  redLock],.      
ee80: 20 20 20 20 20 20 20 61 7a 4c 6b 4e 61 6d 65 5b         azLkName[
ee90: 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 29 29 3b  p->lockState]));
eea0: 0a 20 20 20 20 69 66 28 20 70 47 6f 74 4c 6f 63  .    if( pGotLoc
eeb0: 6b 20 29 20 2a 70 47 6f 74 4c 6f 63 6b 20 3d 20  k ) *pGotLock = 
eec0: 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3b 0a 20 20  p->lockState;.  
eed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eee0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  OK;.  }..  OSTRA
eef0: 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
ef00: 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
ef10: 64 20 72 65 71 75 65 73 74 20 25 73 2d 3e 25 73  d request %s->%s
ef20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
ef30: 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
ef40: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  h,.           p-
ef50: 3e 69 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72  >id, (int)GetCur
ef60: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
ef70: 20 61 7a 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63   azLkName[p->loc
ef80: 6b 53 74 61 74 65 5d 2c 20 0a 20 20 20 20 20 20  kState], .      
ef90: 20 20 20 20 20 61 7a 4c 6b 4e 61 6d 65 5b 64 65       azLkName[de
efa0: 73 69 72 65 64 4c 6f 63 6b 5d 29 29 3b 0a 20 20  siredLock]));.  
efb0: 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 4c 6f  .  if( desiredLo
efc0: 63 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52  ck==SQLITE_SHM_R
efd0: 45 43 4f 56 45 52 20 26 26 20 21 70 2d 3e 68 61  ECOVER && !p->ha
efe0: 73 4d 75 74 65 78 42 75 66 20 29 7b 0a 20 20 20  sMutexBuf ){.   
eff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f000: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
f010: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
f020: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
f030: 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
f040: 6f 64 65 2d 3e 6d 75 74 65 78 42 75 66 29 3b 0a  ode->mutexBuf);.
f050: 20 20 20 20 70 2d 3e 68 61 73 4d 75 74 65 78 42      p->hasMutexB
f060: 75 66 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  uf = 1;.  }.  sq
f070: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f080: 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
f090: 78 29 3b 0a 20 20 73 77 69 74 63 68 28 20 64 65  x);.  switch( de
f0a0: 73 69 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20  siredLock ){.   
f0b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d   case SQLITE_SHM
f0c0: 5f 55 4e 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20  _UNLOCK: {.     
f0d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
f0e0: 53 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48  State!=SQLITE_SH
f0f0: 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20  M_RECOVER );.   
f100: 20 20 20 77 69 6e 53 68 6d 55 6e 6c 6f 63 6b 28     winShmUnlock(
f110: 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 57 49 4e  pShmNode, p, WIN
f120: 5f 53 48 4d 5f 41 7c 57 49 4e 5f 53 48 4d 5f 42  _SHM_A|WIN_SHM_B
f130: 7c 57 49 4e 5f 53 48 4d 5f 43 7c 57 49 4e 5f 53  |WIN_SHM_C|WIN_S
f140: 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 72 63 20  HM_D);.      rc 
f150: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f160: 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
f170: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  = SQLITE_SHM_UNL
f180: 4f 43 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  OCK;.      break
f190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f1a0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44   SQLITE_SHM_READ
f1b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
f1c0: 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
f1d0: 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
f1e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 74  .        int nAt
f1f0: 74 65 6d 70 74 3b 0a 20 20 20 20 20 20 20 20 72  tempt;.        r
f200: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
f210: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f220: 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
f230: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
f240: 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   );.        for(
f250: 6e 41 74 74 65 6d 70 74 3d 30 3b 20 6e 41 74 74  nAttempt=0; nAtt
f260: 65 6d 70 74 3c 35 20 26 26 20 72 63 3d 3d 53 51  empt<5 && rc==SQ
f270: 4c 49 54 45 5f 42 55 53 59 3b 20 6e 41 74 74 65  LITE_BUSY; nAtte
f280: 6d 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  mpt++){.        
f290: 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 68 61    rc = winShmSha
f2a0: 72 65 64 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  redLock(pShmNode
f2b0: 2c 20 70 2c 20 57 49 4e 5f 53 48 4d 5f 41 7c 57  , p, WIN_SHM_A|W
f2c0: 49 4e 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20 20  IN_SHM_B);.     
f2d0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f2e0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
f2f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
f300: 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 53  ShmSharedLock(pS
f310: 68 6d 4e 6f 64 65 2c 20 70 2c 20 57 49 4e 5f 53  hmNode, p, WIN_S
f320: 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 20 20 20  HM_D);.         
f330: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f340: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f350: 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
f360: 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  te = SQLITE_SHM_
f370: 52 45 41 44 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  READ_FULL;.     
f380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f390: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f3a0: 20 20 20 20 20 20 77 69 6e 53 68 6d 55 6e 6c 6f        winShmUnlo
f3b0: 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20  ck(pShmNode, p, 
f3c0: 57 49 4e 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20  WIN_SHM_B);.    
f3d0: 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53          p->lockS
f3e0: 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48  tate = SQLITE_SH
f3f0: 4d 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 20 20  M_READ;.        
f400: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
f410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f420: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
f430: 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
f440: 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  HM_WRITE.       
f450: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
f460: 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
f470: 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20  SHM_RECOVER );. 
f480: 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53         rc = winS
f490: 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 53 68  hmSharedLock(pSh
f4a0: 6d 4e 6f 64 65 2c 20 70 2c 20 57 49 4e 5f 53 48  mNode, p, WIN_SH
f4b0: 4d 5f 41 29 3b 0a 20 20 20 20 20 20 20 20 77 69  M_A);.        wi
f4c0: 6e 53 68 6d 55 6e 6c 6f 63 6b 28 70 53 68 6d 4e  nShmUnlock(pShmN
f4d0: 6f 64 65 2c 20 70 2c 20 57 49 4e 5f 53 48 4d 5f  ode, p, WIN_SHM_
f4e0: 43 7c 57 49 4e 5f 53 48 4d 5f 44 29 3b 0a 20 20  C|WIN_SHM_D);.  
f4f0: 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
f500: 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  te = SQLITE_SHM_
f510: 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  READ;.      }.  
f520: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f530: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f540: 5f 53 48 4d 5f 57 52 49 54 45 3a 20 7b 0a 20 20  _SHM_WRITE: {.  
f550: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
f560: 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
f570: 5f 53 48 4d 5f 52 45 41 44 20 0a 20 20 20 20 20  _SHM_READ .     
f580: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c           || p->l
f590: 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
f5a0: 5f 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 20 29  _SHM_READ_FULL )
f5b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
f5c0: 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  ShmExclusiveLock
f5d0: 28 70 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 57 49  (pShmNode, p, WI
f5e0: 4e 5f 53 48 4d 5f 43 7c 57 49 4e 5f 53 48 4d 5f  N_SHM_C|WIN_SHM_
f5f0: 44 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  D);.      if( rc
f600: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f610: 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74         p->lockSt
f620: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ate = SQLITE_SHM
f630: 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  _WRITE;.      }.
f640: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f650: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
f660: 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e  TE_SHM_CHECKPOIN
f670: 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
f680: 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  t( p->lockState=
f690: 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  =SQLITE_SHM_UNLO
f6a0: 43 4b 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  CK.           ||
f6b0: 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
f6c0: 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e  QLITE_SHM_PENDIN
f6d0: 47 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  G.      );.     
f6e0: 20 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74   if( p->lockStat
f6f0: 65 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  e==SQLITE_SHM_UN
f700: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
f710: 72 63 20 3d 20 77 69 6e 53 68 6d 45 78 63 6c 75  rc = winShmExclu
f720: 73 69 76 65 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  siveLock(pShmNod
f730: 65 2c 20 70 2c 20 57 49 4e 5f 53 48 4d 5f 42 7c  e, p, WIN_SHM_B|
f740: 57 49 4e 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20  WIN_SHM_C);.    
f750: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f770: 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20     p->lockState 
f780: 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e  = SQLITE_SHM_PEN
f790: 44 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a  DING;.        }.
f7a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f7b0: 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d  ( p->lockState==
f7c0: 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49  SQLITE_SHM_PENDI
f7d0: 4e 47 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NG ){.        rc
f7e0: 20 3d 20 77 69 6e 53 68 6d 45 78 63 6c 75 73 69   = winShmExclusi
f7f0: 76 65 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  veLock(pShmNode,
f800: 20 70 2c 20 57 49 4e 5f 53 48 4d 5f 41 29 3b 0a   p, WIN_SHM_A);.
f810: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
f820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f830: 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74         p->lockSt
f840: 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ate = SQLITE_SHM
f850: 5f 43 48 45 43 4b 50 4f 49 4e 54 3b 0a 20 20 20  _CHECKPOINT;.   
f860: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f880: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
f890: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64  .      assert( d
f8a0: 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49  esiredLock==SQLI
f8b0: 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29  TE_SHM_RECOVER )
f8c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f8d0: 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
f8e0: 4c 49 54 45 5f 53 48 4d 5f 52 45 41 44 0a 20 20  LITE_SHM_READ.  
f8f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c           || p->l
f900: 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45  ockState==SQLITE
f910: 5f 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 0a 20  _SHM_READ_FULL. 
f920: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
f930: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f940: 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64  tex_held(pShmNod
f950: 65 2d 3e 6d 75 74 65 78 42 75 66 29 20 29 3b 0a  e->mutexBuf) );.
f960: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
f970: 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  mExclusiveLock(p
f980: 53 68 6d 4e 6f 64 65 2c 20 70 2c 20 57 49 4e 5f  ShmNode, p, WIN_
f990: 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20 20 69 66  SHM_C);.      if
f9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f9b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  ){.        p->lo
f9c0: 63 6b 53 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckState = SQLITE
f9d0: 5f 53 48 4d 5f 52 45 43 4f 56 45 52 3b 0a 20 20  _SHM_RECOVER;.  
f9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f9f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  k;.    }.  }.  s
fa00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
fa10: 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
fa20: 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
fa30: 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 73 68 6d  "SHM-LOCK %d shm
fa40: 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f  id-%d, pid-%d go
fa50: 74 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t %s\n",.       
fa60: 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 46      pShmNode->hF
fa70: 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
fa80: 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29 47     p->id, (int)G
fa90: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
faa0: 49 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70  Id(), azLkName[p
fab0: 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 29 29 3b 0a  ->lockState]));.
fac0: 20 20 69 66 28 20 70 47 6f 74 4c 6f 63 6b 20 29    if( pGotLock )
fad0: 20 2a 70 47 6f 74 4c 6f 63 6b 20 3d 20 70 2d 3e   *pGotLock = p->
fae0: 6c 6f 63 6b 53 74 61 74 65 3b 0a 20 20 72 65 74  lockState;.  ret
faf0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fb00: 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
fb10: 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
fb20: 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
fb30: 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
fb40: 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
fb50: 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
fb60: 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
fb70: 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
fb80: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
fb90: 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
fba0: 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
fbb0: 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
fbc0: 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72   void winShmBarr
fbd0: 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
fbe0: 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
fbf0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
fc00: 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
fc10: 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 2f  memory */.){.  /
fc20: 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  * MemoryBarrier(
fc30: 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77  ); // does not w
fc40: 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e  ork -- do not kn
fc50: 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20  ow why not */.  
fc60: 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
fc70: 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  ();.  winShmLeav
fc80: 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 23 65 6c  eMutex();.}..#el
fc90: 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
fca0: 68 6d 4f 70 65 6e 20 20 20 20 30 0a 23 20 64 65  hmOpen    0.# de
fcb0: 66 69 6e 65 20 77 69 6e 53 68 6d 53 69 7a 65 20  fine winShmSize 
fcc0: 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
fcd0: 6e 53 68 6d 47 65 74 20 20 20 20 20 30 0a 23 20  nShmGet     0.# 
fce0: 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 52 65 6c  define winShmRel
fcf0: 65 61 73 65 20 30 0a 23 20 64 65 66 69 6e 65 20  ease 0.# define 
fd00: 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  winShmLock    0.
fd10: 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42  # define winShmB
fd20: 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
fd30: 65 20 77 69 6e 53 68 6d 43 6c 6f 73 65 20 20 20  e winShmClose   
fd40: 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
fd50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd60: 57 41 4c 20 2a 2f 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a  WAL */./*.******
fd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fd80: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 53 68 61 72  ******* End Shar
fd90: 65 64 20 4d 65 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a  ed Memory ******
fda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdb0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
fdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fde0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fe00: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
fe10: 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
fe20: 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
fe30: 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
fe40: 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
fe50: 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
fe60: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
fe70: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
fe80: 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
fe90: 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20  d = {.  2,      
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
fec0: 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 77  .  winClose,.  w
fed0: 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e 57 72 69  inRead,.  winWri
fee0: 74 65 2c 0a 20 20 77 69 6e 54 72 75 6e 63 61 74  te,.  winTruncat
fef0: 65 2c 0a 20 20 77 69 6e 53 79 6e 63 2c 0a 20 20  e,.  winSync,.  
ff00: 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20 77  winFileSize,.  w
ff10: 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e 6c  inLock,.  winUnl
ff20: 6f 63 6b 2c 0a 20 20 77 69 6e 43 68 65 63 6b 52  ock,.  winCheckR
ff30: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 77  eservedLock,.  w
ff40: 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20  inFileControl,. 
ff50: 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 0a   winSectorSize,.
ff60: 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
ff70: 63 74 65 72 69 73 74 69 63 73 2c 0a 20 20 77 69  cteristics,.  wi
ff80: 6e 53 68 6d 4f 70 65 6e 2c 20 20 20 20 20 20 20  nShmOpen,       
ff90: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4f 70         /* xShmOp
ffa0: 65 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 53 69  en */.  winShmSi
ffb0: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
ffc0: 20 2f 2a 20 78 53 68 6d 53 69 7a 65 20 2a 2f 0a   /* xShmSize */.
ffd0: 20 20 77 69 6e 53 68 6d 47 65 74 2c 20 20 20 20    winShmGet,    
ffe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
fff0: 68 6d 47 65 74 20 2a 2f 0a 20 20 77 69 6e 53 68  hmGet */.  winSh
10000 6d 52 65 6c 65 61 73 65 2c 20 20 20 20 20 20 20  mRelease,       
10010 20 20 20 20 2f 2a 20 78 53 68 6d 52 65 6c 65 61      /* xShmRelea
10020 73 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  se */.  winShmLo
10030 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
10040 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
10050 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
10060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
10070 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
10080 69 6e 53 68 6d 43 6c 6f 73 65 20 20 20 20 20 20  inShmClose      
10090 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 43          /* xShmC
100a0 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  lose */.};../***
100b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 48 65 72 65  ********.** Here
10100 20 65 6e 64 73 20 74 68 65 20 49 2f 4f 20 6d 65   ends the I/O me
10110 74 68 6f 64 73 20 74 68 61 74 20 66 6f 72 6d 20  thods that form 
10120 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
10130 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
10140 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 62 6c  *.** The next bl
10150 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 6d 70 6c  ock of code impl
10160 65 6d 65 6e 74 73 20 74 68 65 20 56 46 53 20 6d  ements the VFS m
10170 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  ethods..********
10180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101c0 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ****/../*.** Con
101d0 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
101e0 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
101f0 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
10200 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
10210 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
10220 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
10230 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
10240 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
10250 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
10260 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
10270 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
10280 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
10290 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
102a0 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69  d *convertUtf8Fi
102b0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
102c0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
102d0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
102e0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e  d = 0;.  if( isN
102f0 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
10300 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e  erted = utf8ToUn
10310 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
10320 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  ;./* isNT() is 1
10330 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
10340 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
10350 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
10360 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20  ecuted. .*/.#if 
10370 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
10380 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
10390 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
103a0 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  8ToMbcs(zFilenam
103b0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  e);.#endif.  }. 
103c0 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
103d0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
103e0 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
103f0 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
10400 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
10410 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
10420 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
10430 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  f must be big en
10440 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20  ough to.** hold 
10450 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  at pVfs->mxPathn
10460 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ame characters..
10470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
10480 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
10490 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
104a0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
104b0 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
104c0 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
104d0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
104e0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
104f0 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
10500 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
10510 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 63  size_t i, j;.  c
10520 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41  har zTempPath[MA
10530 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 66 28  X_PATH+1];.  if(
10540 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
10550 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
10560 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10570 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
10580 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71  mpPath, "%s", sq
10590 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
105a0 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69  tory);.  }else i
105b0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
105c0 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
105d0 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61     WCHAR zWidePa
105e0 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
105f0 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d    GetTempPathW(M
10600 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64  AX_PATH-30, zWid
10610 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c  ePath);.    zMul
10620 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ti = unicodeToUt
10630 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
10640 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
10650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
10660 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
10670 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
10680 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
10690 20 20 20 20 20 66 72 65 65 28 7a 4d 75 6c 74 69       free(zMulti
106a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
106b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
106c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f  E_NOMEM;.    }./
106d0 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
106e0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
106f0 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
10700 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
10710 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
10720 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
10730 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
10740 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
10750 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
10760 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
10770 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
10780 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
10790 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
107a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
107b0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
107c0 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
107d0 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d  char zMbcsPath[M
107e0 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65  AX_PATH];.    Ge
107f0 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50  tTempPathA(MAX_P
10800 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74  ATH-30, zMbcsPat
10810 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20  h);.    zUtf8 = 
10820 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
10830 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73  cs_to_utf8(zMbcs
10840 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
10850 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71  Utf8 ){.      sq
10860 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
10870 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
10880 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74  pPath, "%s", zUt
10890 66 38 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  f8);.      free(
108a0 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
108b0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
108c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
108d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
108e0 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74   for(i=sqlite3St
108f0 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
10900 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50  ); i>0 && zTempP
10910 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20  ath[i-1]=='\\'; 
10920 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61  i--){}.  zTempPa
10930 74 68 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  th[i] = 0;.  sql
10940 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
10950 75 66 2d 33 30 2c 20 7a 42 75 66 2c 0a 20 20 20  uf-30, zBuf,.   
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d  "%s\\"SQLITE_TEM
10980 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
10990 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d  TempPath);.  j =
109a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
109b0 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65  (zBuf);.  sqlite
109c0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 32 30 2c  3_randomness(20,
109d0 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f   &zBuf[j]);.  fo
109e0 72 28 69 3d 30 3b 20 69 3c 32 30 3b 20 69 2b 2b  r(i=0; i<20; i++
109f0 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66  , j++){.    zBuf
10a00 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
10a10 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
10a20 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
10a30 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
10a40 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d  ];.  }.  zBuf[j]
10a50 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28   = 0;.  OSTRACE(
10a60 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a  ("TEMP FILENAME:
10a70 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a   %s\n", zBuf));.
10a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10a90 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  OK; .}../*.** Th
10aa0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
10ab0 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  f getLastErrorMs
10ac0 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  g.** is zero if 
10ad0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
10ae0 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
10af0 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
10b00 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
10b10 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
10b20 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a  as truncated)..*
10b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
10b40 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 69 6e 74  LastErrorMsg(int
10b50 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
10b60 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d  f){.  /* FormatM
10b70 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30  essage returns 0
10b80 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74   on failure.  Ot
10b90 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20  herwise it.  ** 
10ba0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
10bb0 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69  er of TCHARs wri
10bc0 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
10bd0 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  ut.  ** buffer, 
10be0 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  excluding the te
10bf0 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63  rminating null c
10c00 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52  har..  */.  DWOR
10c10 44 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73  D error = GetLas
10c20 74 45 72 72 6f 72 28 29 3b 0a 20 20 44 57 4f 52  tError();.  DWOR
10c30 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  D dwLen = 0;.  c
10c40 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a  har *zOut = 0;..
10c50 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
10c60 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d 70      WCHAR *zTemp
10c70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
10c80 20 64 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74 4d   dwLen = FormatM
10c90 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
10ca0 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
10cb0 42 55 46 46 45 52 20 7c 20 46 4f 52 4d 41 54 5f  BUFFER | FORMAT_
10cc0 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
10cd0 54 45 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53  TEM | FORMAT_MES
10ce0 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
10cf0 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d30 20 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20 20   error,.        
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70   (LPWSTR) &zTemp
10d80 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Wide,.          
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10da0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
10dc0 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  );.    if( dwLen
10dd0 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
10de0 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
10df0 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
10e00 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
10e10 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
10e20 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b  Utf8(zTempWide);
10e30 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
10e40 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
10e50 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
10e60 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
10e70 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a       LocalFree(z
10e80 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 7d  TempWide);.    }
10e90 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
10ea0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
10eb0 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
10ec0 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
10ed0 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
10ee0 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
10ef0 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
10f00 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
10f10 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
10f20 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
10f30 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
10f40 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
10f50 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
10f60 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10f70 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
10f80 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
10f90 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
10fa0 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28   FormatMessageA(
10fb0 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
10fc0 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
10fd0 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
10fe0 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46 4f  FROM_SYSTEM | FO
10ff0 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
11000 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c 0a           error,.
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11060 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29           (LPSTR)
11090 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20   &zTemp,.       
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77    0);.    if( dw
110e0 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
110f0 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
11100 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
11110 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
11120 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
11130 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
11140 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
11150 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
11160 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
11170 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
11180 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
11190 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70   LocalFree(zTemp
111a0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
111b0 20 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20 64    }.  if( 0 == d
111c0 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
111d0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
111e0 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
111f0 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 65 72  r 0x%x (%u)", er
11200 72 6f 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20 7d  ror, error);.  }
11210 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70  else{.    /* cop
11220 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e  y a maximum of n
11230 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74  Buf chars to out
11240 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
11250 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11260 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
11270 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
11280 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38  /* free the UTF8
11290 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 66   buffer */.    f
112a0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
112b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
112c0 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
112d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
112e0 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
112f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
11300 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
11310 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
11320 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
11330 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
11340 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
11350 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11360 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
11370 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
11380 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
11390 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113b0 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
113c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
113d0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
113e0 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
113f0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
11400 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
11410 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
11420 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
11430 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
11440 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
11450 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
11460 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
11470 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
11480 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
11490 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
114a0 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
114b0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
114c0 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
114d0 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
114e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
114f0 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f  ename in OS enco
11500 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ding */.  const 
11510 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20  char *zUtf8Name 
11520 3d 20 7a 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 46  = zName;    /* F
11530 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
11540 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
11550 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
11560 5f 50 41 54 48 2b 31 5d 3b 20 20 20 20 20 20 20  _PATH+1];       
11570 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
11580 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20 66  to create temp f
11590 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 61 73  ilename */..  as
115a0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
115b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
115c0 52 28 70 56 66 73 29 3b 0a 0a 20 20 70 46 69 6c  R(pVfs);..  pFil
115d0 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
115e0 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20  ANDLE_VALUE;..  
115f0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
11600 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
11610 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
11620 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
11630 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
11640 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
11650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
11660 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 69 6e  f8Name ){.    in
11670 74 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61  t rc = getTempna
11680 6d 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a  me(MAX_PATH+1, z
11690 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
116a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
116b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
116c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
116d0 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
116e0 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  me;.  }..  /* Co
116f0 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
11700 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
11710 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
11720 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
11730 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
11740 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
11750 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
11760 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11770 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11780 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
11790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
117a0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 64 77 44  WRITE ){.    dwD
117b0 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
117c0 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
117d0 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
117e0 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
117f0 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
11800 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  RIC_READ;.  }.  
11810 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  /* SQLITE_OPEN_E
11820 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64  XCLUSIVE is used
11830 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
11840 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73  at a new file is
11850 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20   .  ** created. 
11860 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75  SQLite doesn't u
11870 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74  se it to indicat
11880 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63  e "exclusive acc
11890 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74  ess" .  ** as it
118a0 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65   is usually unde
118b0 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 61  rstood..  */.  a
118c0 73 73 65 72 74 28 21 28 66 6c 61 67 73 20 26 20  ssert(!(flags & 
118d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
118e0 55 53 49 56 45 29 20 7c 7c 20 28 66 6c 61 67 73  USIVE) || (flags
118f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
11900 52 45 41 54 45 29 29 3b 0a 20 20 69 66 28 20 66  REATE));.  if( f
11910 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
11920 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  EN_EXCLUSIVE ){.
11930 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
11940 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
11950 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
11960 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
11970 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
11980 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
11990 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
119a0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
119b0 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
119c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
119d0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
119e0 5f 43 52 45 41 54 45 20 29 7b 0a 20 20 20 20 2f  _CREATE ){.    /
119f0 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20  * Open existing 
11a00 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20  file, or create 
11a10 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  if it doesn't ex
11a20 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ist */.    dwCre
11a30 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
11a40 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
11a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
11a60 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e  Opens a file, on
11a70 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ly if it exists.
11a80 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
11a90 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
11aa0 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20  OPEN_EXISTING;. 
11ab0 20 7d 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65   }.  dwShareMode
11ac0 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
11ad0 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
11ae0 57 52 49 54 45 3b 0a 20 20 69 66 28 20 66 6c 61  WRITE;.  if( fla
11af0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
11b00 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
11b10 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
11b20 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
11b30 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
11b40 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
11b50 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
11b60 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
11b70 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
11b80 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
11b90 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
11ba0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bc0 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
11bd0 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
11be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11bf0 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
11c00 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
11c10 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
11c20 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
11c30 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
11c40 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
11c50 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
11c60 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
11c70 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
11c80 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
11c90 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
11ca0 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
11cb0 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
11cc0 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
11cd0 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
11ce0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
11cf0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
11d00 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
11d10 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
11d20 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
11d30 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d  sNT() ){.    h =
11d40 20 43 72 65 61 74 65 46 69 6c 65 57 28 28 57 43   CreateFileW((WC
11d50 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
11d60 0a 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65  .       dwDesire
11d70 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
11d80 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20  dwShareMode,.   
11d90 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
11da0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
11db0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64  sition,.       d
11dc0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
11dd0 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  tes,.       NULL
11de0 0a 20 20 20 20 29 3b 0a 2f 2a 20 69 73 4e 54 28  .    );./* isNT(
11df0 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45  ) is 1 if SQLITE
11e00 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f  _OS_WINCE==1, so
11e10 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65   this else is ne
11e20 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  ver executed. .*
11e30 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49  * Since the ASCI
11e40 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  I version of the
11e50 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64  se Windows API d
11e60 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20  o not exist for 
11e70 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69  WINCE,.** it's i
11e80 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20  mportant to not 
11e90 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66  reference them f
11ea0 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e  or WINCE builds.
11eb0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
11ec0 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
11ed0 73 65 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61  se{.    h = Crea
11ee0 74 65 46 69 6c 65 41 28 28 63 68 61 72 2a 29 7a  teFileA((char*)z
11ef0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
11f00 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
11f10 73 2c 0a 20 20 20 20 20 20 20 64 77 53 68 61 72  s,.       dwShar
11f20 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e 55  eMode,.       NU
11f30 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77 43 72 65  LL,.       dwCre
11f40 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
11f50 2c 0a 20 20 20 20 20 20 20 64 77 46 6c 61 67 73  ,.       dwFlags
11f60 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
11f70 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29        NULL.    )
11f80 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f  ;.#endif.  }.  O
11f90 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  STRACE(("OPEN %d
11fa0 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c   %s 0x%lx %s\n",
11fb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20   .           h, 
11fc0 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  zName, dwDesired
11fd0 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20  Access, .       
11fe0 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48      h==INVALID_H
11ff0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66  ANDLE_VALUE ? "f
12000 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
12010 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
12020 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
12030 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  {.    free(zConv
12040 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20  erted);.    if( 
12050 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
12060 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b  PEN_READWRITE ){
12070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
12080 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
12090 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
120a0 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
120b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
120c0 59 29 26 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y)&~SQLITE_OPEN_
120d0 52 45 41 44 57 52 49 54 45 29 2c 20 70 4f 75 74  READWRITE), pOut
120e0 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73  Flags);.    }els
120f0 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
12100 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
12110 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
12120 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
12130 29 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  ){.    if( flags
12140 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
12150 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20 20  EADWRITE ){.    
12160 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
12170 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
12180 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
12190 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
121a0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
121b0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
121c0 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 46 69    }.  memset(pFi
121d0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
121e0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
121f0 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49  >pMethod = &winI
12200 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
12210 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 46 69 6c 65  ->h = h;.  pFile
12220 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
12230 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
12240 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
12250 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b  pFile->pShm = 0;
12260 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
12270 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 46 69 6c 65  = zName;.  pFile
12280 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 67  ->sectorSize = g
12290 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 56 66  etSectorSize(pVf
122a0 73 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 23  s, zUtf8Name);.#
122b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
122c0 43 45 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  CE.  if( (flags 
122d0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  & (SQLITE_OPEN_R
122e0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
122f0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 29 20 3d  OPEN_MAIN_DB)) =
12300 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
12310 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
12320 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
12330 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20 20  PEN_MAIN_DB).   
12340 20 20 20 20 26 26 20 21 77 69 6e 63 65 43 72 65      && !winceCre
12350 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70  ateLock(zName, p
12360 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 43  File).  ){.    C
12370 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20  loseHandle(h);. 
12380 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
12390 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ed);.    return 
123a0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
123b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
123c0 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46  isTemp ){.    pF
123d0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
123e0 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64  ose = zConverted
123f0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
12400 0a 20 20 7b 0a 20 20 20 20 66 72 65 65 28 7a 43  .  {.    free(zC
12410 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 20  onverted);.  }. 
12420 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
12430 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12440 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
12450 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
12460 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
12470 20 74 68 61 74 20 77 69 6e 64 6f 77 73 20 64 6f   that windows do
12480 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
12490 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
124a0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
124b0 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
124c0 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
124d0 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
124e0 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
124f0 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
12500 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
12510 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
12520 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
12530 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
12540 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
12550 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
12560 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
12570 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
12580 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
12590 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
125a0 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
125b0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
125c0 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
125d0 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
125e0 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
125f0 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
12600 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
12610 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
12620 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
12630 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
12640 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
12650 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
12660 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
12670 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
12680 54 53 20 35 0a 73 74 61 74 69 63 20 69 6e 74 20  TS 5.static int 
12690 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
126a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
126b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
126c0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
126d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
126e0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
126f0 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
12700 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
12710 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
12720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
12730 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
12740 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
12750 20 30 3b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a   0;.  DWORD rc;.
12760 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20    DWORD error = 
12770 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  0;.  void *zConv
12780 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
12790 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
127a0 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
127b0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
127c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
127d0 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 20  ETER(syncDir);. 
127e0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
127f0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
12800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12810 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
12820 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
12830 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
12840 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
12850 7b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  {.    do{.      
12860 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e  DeleteFileW(zCon
12870 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68  verted);.    }wh
12880 69 6c 65 28 20 20 20 28 20 20 20 28 28 72 63 20  ile(   (   ((rc 
12890 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
128a0 74 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesW(zConverted)
128b0 29 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  ) != INVALID_FIL
128c0 45 5f 41 54 54 52 49 42 55 54 45 53 29 0a 20 20  E_ATTRIBUTES).  
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
128e0 28 28 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73  ((error = GetLas
128f0 74 45 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52  tError()) == ERR
12900 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
12910 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  )).           &&
12920 20 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c   (++cnt < MX_DEL
12930 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a  ETION_ATTEMPTS).
12940 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 53             && (S
12950 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
12960 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
12970 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12980 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
12990 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
129a0 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
129b0 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
129c0 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
129d0 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
129e0 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
129f0 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
12a00 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
12a10 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
12a20 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
12a30 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
12a40 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
12a50 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65 74   do{.      Delet
12a60 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
12a70 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  d);.    }while( 
12a80 20 20 28 20 20 20 28 28 72 63 20 3d 20 47 65 74    (   ((rc = Get
12a90 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
12aa0 7a 43 6f 6e 76 65 72 74 65 64 29 29 20 21 3d 20  zConverted)) != 
12ab0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
12ac0 52 49 42 55 54 45 53 29 0a 20 20 20 20 20 20 20  RIBUTES).       
12ad0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 65 72 72          || ((err
12ae0 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
12af0 72 28 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41 43  r()) == ERROR_AC
12b00 43 45 53 53 5f 44 45 4e 49 45 44 29 29 0a 20 20  CESS_DENIED)).  
12b10 20 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b 63           && (++c
12b20 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  nt < MX_DELETION
12b30 5f 41 54 54 45 4d 50 54 53 29 0a 20 20 20 20 20  _ATTEMPTS).     
12b40 20 20 20 20 20 20 26 26 20 28 53 6c 65 65 70 28        && (Sleep(
12b50 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 65 6e 64  100), 1) );.#end
12b60 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43  if.  }.  free(zC
12b70 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54  onverted);.  OST
12b80 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22  RACE(("DELETE \"
12b90 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c  %s\" %s\n", zFil
12ba0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 28 20  ename,.       ( 
12bb0 28 72 63 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  (rc==INVALID_FIL
12bc0 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
12bd0 20 28 65 72 72 6f 72 3d 3d 45 52 52 4f 52 5f 46   (error==ERROR_F
12be0 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20  ILE_NOT_FOUND)) 
12bf0 3f 0a 20 20 20 20 20 20 20 20 20 22 6f 6b 22 20  ?.         "ok" 
12c00 3a 20 22 66 61 69 6c 65 64 22 20 29 29 3b 0a 20  : "failed" ));. 
12c10 0a 20 20 72 65 74 75 72 6e 20 28 20 20 20 28 72  .  return (   (r
12c20 63 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  c == INVALID_FIL
12c30 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 0a 20  E_ATTRIBUTES) . 
12c40 20 20 20 20 20 20 20 20 20 26 26 20 28 65 72 72           && (err
12c50 6f 72 20 3d 3d 20 45 52 52 4f 52 5f 46 49 4c 45  or == ERROR_FILE
12c60 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 20 53  _NOT_FOUND)) ? S
12c70 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
12c80 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a  E_IOERR_DELETE;.
12c90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
12ca0 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64  he existance and
12cb0 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
12cc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12cd0 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
12ce0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
12d00 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
12d10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12d20 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
12d30 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
12d40 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
12d50 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12d60 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
12d70 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
12d80 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
12d90 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
12da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12db0 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b  UT: Result */.){
12dc0 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
12dd0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 76   int rc = 0;.  v
12de0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
12df0 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
12e00 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
12e10 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12e20 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66  ETER(pVfs);.  if
12e30 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
12e40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12e50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
12e60 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
12e70 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69      attr = GetFi
12e80 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 28 57  leAttributesW((W
12e90 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64  CHAR*)zConverted
12ea0 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  );./* isNT() is 
12eb0 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
12ec0 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
12ed0 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
12ee0 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
12ef0 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
12f00 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
12f10 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
12f20 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
12f30 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
12f40 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
12f50 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
12f60 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
12f70 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12f80 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
12f90 20 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c     attr = GetFil
12fa0 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
12fb0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
12fc0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72  .#endif.  }.  fr
12fd0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
12fe0 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20    switch( flags 
12ff0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
13000 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a  TE_ACCESS_READ:.
13010 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
13020 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20  ACCESS_EXISTS:. 
13030 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
13040 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
13050 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62  RIBUTES;.      b
13060 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
13070 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
13080 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63  DWRITE:.      rc
13090 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f   = (attr & FILE_
130a0 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e  ATTRIBUTE_READON
130b0 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72  LY)==0;.      br
130c0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
130d0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21  :.      assert(!
130e0 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61  "Invalid flags a
130f0 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20  rgument");.  }. 
13100 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
13110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13120 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75  OK;.}.../*.** Tu
13130 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rn a relative pa
13140 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75  thname into a fu
13150 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72  ll pathname.  Wr
13160 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20  ite the full.** 
13170 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f  pathname into zO
13180 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69  ut[].  zOut[] wi
13190 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70  ll be at least p
131a0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
131b0 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
131c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
131d0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
131e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
131f0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
13200 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
13210 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  fs object */.  c
13220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
13230 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tive,        /* 
13240 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76  Possibly relativ
13250 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a  e input path */.
13260 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20    int nFull,    
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13280 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75  /* Size of outpu
13290 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65  t buffer in byte
132a0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75  s */.  char *zFu
132b0 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
132c0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62       /* Output b
132d0 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23  uffer */.){.  .#
132e0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
132f0 57 49 4e 5f 5f 29 0a 20 20 55 4e 55 53 45 44 5f  WIN__).  UNUSED_
13300 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
13310 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  ;.  cygwin_conv_
13320 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61  to_full_win32_pa
13330 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  th(zRelative, zF
13340 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ull);.  return S
13350 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
13360 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
13370 57 49 4e 43 45 0a 20 20 55 4e 55 53 45 44 5f 50  WINCE.  UNUSED_P
13380 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b  ARAMETER(nFull);
13390 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
133a0 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
133b0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
133c0 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
133d0 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ld. */.  sqlite3
133e0 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e  _snprintf(pVfs->
133f0 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  mxPathname, zFul
13400 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
13410 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ve);.  return SQ
13420 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
13430 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
13440 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
13450 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
13460 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  int nByte;.  voi
13470 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
13480 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 55   char *zOut;.  U
13490 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
134a0 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65  nFull);.  zConve
134b0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
134c0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
134d0 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73 4e  tive);.  if( isN
134e0 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52  T() ){.    WCHAR
134f0 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
13500 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68  te = GetFullPath
13510 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43  NameW((WCHAR*)zC
13520 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
13530 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d  0) + 3;.    zTem
13540 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  p = malloc( nByt
13550 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
13560 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
13570 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
13580 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
13590 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
135a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
135b0 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61   }.    GetFullPa
135c0 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29  thNameW((WCHAR*)
135d0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
135e0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
135f0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
13600 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75  d);.    zOut = u
13610 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
13620 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54  mp);.    free(zT
13630 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  emp);./* isNT() 
13640 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
13650 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
13660 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
13670 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
13680 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
13690 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
136a0 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
136b0 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
136c0 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
136d0 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
136e0 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
136f0 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
13700 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
13710 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
13720 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
13730 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47  p;.    nByte = G
13740 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
13750 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
13760 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b  d, 0, 0, 0) + 3;
13770 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c  .    zTemp = mal
13780 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
13790 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
137a0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
137b0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43  ){.      free(zC
137c0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
137d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
137e0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
137f0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
13800 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
13810 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
13820 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 0);.    free(z
13830 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
13840 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
13850 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
13860 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
13870 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64 69  ee(zTemp);.#endi
13880 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74  f.  }.  if( zOut
13890 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
138a0 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
138b0 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  xPathname, zFull
138c0 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
138d0 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20     free(zOut);. 
138e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
138f0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
13900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13910 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
13920 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74  f.}../*.** Get t
13930 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f  he sector size o
13940 66 20 74 68 65 20 64 65 76 69 63 65 20 75 73 65  f the device use
13950 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 66 69  d to store.** fi
13960 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13970 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28  t getSectorSize(
13980 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
13990 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e 73   *pVfs,.    cons
139a0 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
139b0 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 66  e     /* UTF-8 f
139c0 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  ile name */.){. 
139d0 20 44 57 4f 52 44 20 62 79 74 65 73 50 65 72 53   DWORD bytesPerS
139e0 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
139f0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
13a00 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44 69 73 6b  ZE;.  /* GetDisk
13a10 46 72 65 65 53 70 61 63 65 20 69 73 20 6e 6f 74  FreeSpace is not
13a20 20 73 75 70 70 6f 72 74 65 64 20 75 6e 64 65 72   supported under
13a30 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66 20 53 51   WINCE */.#if SQ
13a40 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13a50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13a60 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
13a70 5f 50 41 52 41 4d 45 54 45 52 28 7a 52 65 6c 61  _PARAMETER(zRela
13a80 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63  tive);.#else.  c
13a90 68 61 72 20 7a 46 75 6c 6c 70 61 74 68 5b 4d 41  har zFullpath[MA
13aa0 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 6e 74  X_PATH+1];.  int
13ab0 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 64 77 52   rc;.  DWORD dwR
13ac0 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  et = 0;.  DWORD 
13ad0 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a 20  dwDummy;..  /*. 
13ae0 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 67   ** We need to g
13af0 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  et the full path
13b00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
13b10 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74 20 74 68  e.  ** to get th
13b20 65 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 74  e drive letter t
13b30 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73 65  o look up the se
13b40 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a  ctor.  ** size..
13b50 20 20 2a 2f 0a 20 20 72 63 20 3d 20 77 69 6e 46    */.  rc = winF
13b60 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
13b70 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41 58  , zRelative, MAX
13b80 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74 68  _PATH, zFullpath
13b90 29 3b 0a 20 20 69 66 28 20 72 63 20 3d 3d 20 53  );.  if( rc == S
13ba0 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20 7b 0a 20  QLITE_OK ).  {. 
13bb0 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72     void *zConver
13bc0 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
13bd0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 70  8Filename(zFullp
13be0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 43  ath);.    if( zC
13bf0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
13c00 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
13c10 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20          /* trim 
13c20 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69  path to just dri
13c30 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  ve reference */.
13c40 20 20 20 20 20 20 20 20 57 43 48 41 52 20 2a 70          WCHAR *p
13c50 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
13c60 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70         for(;*p;p
13c70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
13c80 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b  f( *p == '\\' ){
13c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 20  .            *p 
13ca0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
13cb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13cd0 0a 20 20 20 20 20 20 20 20 64 77 52 65 74 20 3d  .        dwRet =
13ce0 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63   GetDiskFreeSpac
13cf0 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
13d00 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
13d30 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 26 62 79 74 65 73 50 65 72 53 65       &bytesPerSe
13d60 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ctor,.          
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d80 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
13d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20      &dwDummy);. 
13dc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13dd0 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68      /* trim path
13de0 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20 72   to just drive r
13df0 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20  eference */.    
13e00 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
13e10 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72 74 65 64  har *)zConverted
13e20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a  ;.        for(;*
13e30 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  p;p++){.        
13e40 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27    if( *p == '\\'
13e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13e60 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  *p = '\0';.     
13e70 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13e80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e90 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65    }.        dwRe
13ea0 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53  t = GetDiskFreeS
13eb0 70 61 63 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  paceA((char*)zCo
13ec0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ee0 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
13ef0 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mmy,.           
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 20 26 62 79 74 65 73 50 65 72         &bytesPer
13f20 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  Sector,.        
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d            &dwDum
13f50 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  my,.            
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29 3b        &dwDummy);
13f80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13f90 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
13fa0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
13fb0 64 77 52 65 74 20 29 7b 0a 20 20 20 20 20 20 62  dwRet ){.      b
13fc0 79 74 65 73 50 65 72 53 65 63 74 6f 72 20 3d 20  ytesPerSector = 
13fd0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
13fe0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20  ECTOR_SIZE;.    
13ff0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
14000 65 74 75 72 6e 20 28 69 6e 74 29 20 62 79 74 65  eturn (int) byte
14010 73 50 65 72 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a  sPerSector; .}..
14020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14030 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
14040 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
14050 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
14060 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
14070 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
14080 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
14090 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
140a0 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
140b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
140c0 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e  ary..*/./*.** In
140d0 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
140e0 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
140f0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
14100 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
14110 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
14120 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
14130 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
14140 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61   library..*/.sta
14150 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f  tic void *winDlO
14160 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
14170 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
14180 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
14190 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69   HANDLE h;.  voi
141a0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
141b0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
141c0 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
141d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
141e0 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20  ER(pVfs);.  if( 
141f0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
14200 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14210 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
14220 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c  ){.    h = LoadL
14230 69 62 72 61 72 79 57 28 28 57 43 48 41 52 2a 29  ibraryW((WCHAR*)
14240 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 2f 2a 20  zConverted);./* 
14250 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
14260 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
14270 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
14280 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
14290 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
142a0 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
142b0 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
142c0 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
142d0 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
142e0 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
142f0 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
14300 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
14310 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
14320 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
14330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d    }else{.    h =
14340 20 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63   LoadLibraryA((c
14350 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
14360 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66  ;.#endif.  }.  f
14370 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
14380 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
14390 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
143a0 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
143b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
143c0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
143d0 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
143e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
143f0 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72  s);.  getLastErr
14400 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66  orMsg(nBuf, zBuf
14410 4f 75 74 29 3b 0a 7d 0a 76 6f 69 64 20 28 2a 77  Out);.}.void (*w
14420 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  inDlSym(sqlite3_
14430 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
14440 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20  *pHandle, const 
14450 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28  char *zSymbol))(
14460 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  void){.  UNUSED_
14470 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
14480 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
14490 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65  INCE.  /* The Ge
144a0 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20  tProcAddressA() 
144b0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
144c0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e  available on win
144d0 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ce. */.  return 
144e0 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 47  (void(*)(void))G
144f0 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28  etProcAddressA((
14500 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20  HANDLE)pHandle, 
14510 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a  zSymbol);.#else.
14520 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77    /* All other w
14530 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
14540 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41   expect GetProcA
14550 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65  ddress() to take
14560 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74  .  ** an Ansi st
14570 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ring regardless 
14580 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20  of the _UNICODE 
14590 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74  setting */.  ret
145a0 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69  urn (void(*)(voi
145b0 64 29 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  d))GetProcAddres
145c0 73 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  s((HANDLE)pHandl
145d0 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e  e, zSymbol);.#en
145e0 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c  dif.}.void winDl
145f0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
14600 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
14610 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
14620 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
14630 29 3b 0a 20 20 46 72 65 65 4c 69 62 72 61 72 79  );.  FreeLibrary
14640 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
14650 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
14660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
14670 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
14680 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
14690 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
146a0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
146b0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
146c0 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
146d0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
146e0 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  lose 0.#endif...
146f0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
14700 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
14710 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
14720 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
14730 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
14740 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
14750 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
14760 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
14770 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  t n = 0;.  UNUSE
14780 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
14790 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
147a0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20  QLITE_TEST).  n 
147b0 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74  = nBuf;.  memset
147c0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
147d0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
147e0 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c  eof(SYSTEMTIME)<
147f0 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53  =nBuf-n ){.    S
14800 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20  YSTEMTIME x;.   
14810 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26   GetSystemTime(&
14820 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
14830 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
14840 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
14850 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
14860 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
14870 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
14880 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
14890 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
148a0 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  sId();.    memcp
148b0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64  y(&zBuf[n], &pid
148c0 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
148d0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
148e0 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pid);.  }.  if( 
148f0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
14900 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
14910 52 44 20 63 6e 74 20 3d 20 47 65 74 54 69 63 6b  RD cnt = GetTick
14920 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d  Count();.    mem
14930 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
14940 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
14950 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
14960 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66  f(cnt);.  }.  if
14970 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  ( sizeof(LARGE_I
14980 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20  NTEGER)<=nBuf-n 
14990 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54  ){.    LARGE_INT
149a0 45 47 45 52 20 69 3b 0a 20 20 20 20 51 75 65 72  EGER i;.    Quer
149b0 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
149c0 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d  ter(&i);.    mem
149d0 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69  cpy(&zBuf[n], &i
149e0 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20  , sizeof(i));.  
149f0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29    n += sizeof(i)
14a00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
14a10 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
14a20 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
14a30 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
14a40 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
14a50 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
14a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
14a70 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
14a80 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63  s *pVfs, int mic
14a90 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65 65 70 28  rosec){.  Sleep(
14aa0 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
14ab0 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
14ac0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
14ad0 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
14ae0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
14af0 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
14b00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
14b10 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
14b20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
14b30 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
14b40 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
14b50 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
14b60 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
14b70 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
14b80 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
14b90 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
14ba0 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
14bb0 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
14bc0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
14bd0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
14be0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
14bf0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
14c00 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
14c10 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
14c20 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
14c30 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
14c40 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
14c50 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
14c60 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
14c70 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
14c80 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
14c90 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
14ca0 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
14cb0 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
14cc0 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
14cd0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
14ce0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
14cf0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
14d00 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
14d10 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
14d20 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
14d30 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
14d40 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
14d50 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
14d60 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
14d70 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
14d80 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
14d90 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
14da0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
14db0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
14dc0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
14dd0 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
14de0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
14df0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
14e00 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45  iNow){.  /* FILE
14e10 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
14e20 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
14e30 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
14e40 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  e number of .   
14e50 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64    100-nanosecond
14e60 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65   intervals since
14e70 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31   January 1, 1601
14e80 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35   (= JD 2305813.5
14e90 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54  ). .  */.  FILET
14ea0 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63  IME ft;.  static
14eb0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
14ec0 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65  nt64 winFiletime
14ed0 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35  Epoch = 23058135
14ee0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
14ef0 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20  8640000;.#ifdef 
14f00 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74  SQLITE_TEST.  st
14f10 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
14f20 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
14f30 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
14f40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
14f50 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  0000;.#endif.  /
14f60 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69  * 2^32 - to avoi
14f70 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20  d use of LL and 
14f80 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20  warnings in gcc 
14f90 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
14fa0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
14fb0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20  max32BitValue = 
14fc0 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  .      (sqlite3_
14fd0 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
14fe0 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   + (sqlite3_int6
14ff0 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
15000 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39  sqlite3_int64)29
15010 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51  4967296;..#if SQ
15020 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
15030 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b  SYSTEMTIME time;
15040 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65  .  GetSystemTime
15050 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66  (&time);.  /* if
15060 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c   SystemTimeToFil
15070 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69  eTime() fails, i
15080 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  t returns zero. 
15090 2a 2f 0a 20 20 69 66 20 28 21 53 79 73 74 65 6d  */.  if (!System
150a0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
150b0 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
150c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65  return 1;.  }.#e
150d0 6c 73 65 0a 20 20 47 65 74 53 79 73 74 65 6d 54  lse.  GetSystemT
150e0 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
150f0 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
15100 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
15110 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
15120 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
15130 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
15140 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
15150 33 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20  32BitValue) + . 
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
15170 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
15180 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28  dwLowDateTime)/(
15190 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30  sqlite3_int64)10
151a0 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  00;..#ifdef SQLI
151b0 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
151c0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
151d0 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
151e0 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
151f0 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
15200 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
15210 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
15220 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
15230 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
15240 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
15250 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
15260 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
15270 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
15280 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
15290 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
152a0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
152b0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
152c0 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
152d0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
152e0 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
152f0 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
15300 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
15310 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72 72  ..*/.int winCurr
15320 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
15330 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c  vfs *pVfs, doubl
15340 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74  e *prNow){.  int
15350 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   rc;.  sqlite3_i
15360 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77  nt64 i;.  rc = w
15370 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
15380 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20  64(pVfs, &i);.  
15390 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a  if( !rc ){.    *
153a0 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
153b0 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  00.0;.  }.  retu
153c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
153d0 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
153e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
153f0 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62  orks like a comb
15400 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65  ination of.** Ge
15410 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64  tLastError() and
15420 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29   FormatMessage()
15430 20 6f 6e 20 77 69 6e 64 6f 77 73 20 28 6f 72 20   on windows (or 
15440 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72  errno and.** str
15450 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 75 6e 69  error_r() on uni
15460 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72  x). After an err
15470 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  or is returned b
15480 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74  y an OS.** funct
15490 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c  ion, SQLite call
154a0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
154b0 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69  with zBuf pointi
154c0 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65  ng to.** a buffe
154d0 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e  r of nBuf bytes.
154e0 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68   The OS layer sh
154f0 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68  ould populate th
15500 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68  e.** buffer with
15510 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
15520 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  d UTF-8 encoded 
15530 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
15540 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
15550 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f  last IO error to
15560 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77   have occurred w
15570 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e  ithin the callin
15580 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  g.** thread..**.
15590 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
155a0 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c  message is too l
155b0 61 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70  arge for the sup
155c0 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a  plied buffer,.**
155d0 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72   it should be tr
155e0 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74  uncated. The ret
155f0 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65  urn value of xGe
15600 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73  tLastError.** is
15610 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
15620 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
15630 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
15640 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
15650 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
15660 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
15670 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a  cated). If non-z
15680 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ero is returned,
15690 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e  .** then it is n
156a0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
156b0 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d  include the nul-
156c0 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61  terminator chara
156d0 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  cter.** in the o
156e0 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a  utput buffer..**
156f0 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e  .** Not supplyin
15700 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  g an error messa
15710 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  ge will have no 
15720 61 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a  adverse effect.*
15730 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20  * on SQLite. It 
15740 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20  is fine to have 
15750 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  an implementatio
15760 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20  n that never.** 
15770 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
15780 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20   message:.**.** 
15790 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72    int xGetLastEr
157a0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
157b0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
157c0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a   char *zBuf){.**
157d0 20 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66       assert(zBuf
157e0 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20  [0]=='\0');.**  
157f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20     return 0;.** 
15800 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65    }.**.** Howeve
15810 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65  r if an error me
15820 73 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65  ssage is supplie
15830 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e  d, it will be in
15840 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79  corporated.** by
15850 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65   sqlite into the
15860 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
15870 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20  vailable to the 
15880 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71  user using.** sq
15890 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20  lite3_errmsg(), 
158a0 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20  possibly making 
158b0 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72  IO errors easier
158c0 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74   to debug..*/.st
158d0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c  atic int winGetL
158e0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
158f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
15900 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
15910 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
15920 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
15930 65 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72  eturn getLastErr
15940 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66  orMsg(nBuf, zBuf
15950 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  );.}..../*.** In
15960 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
15970 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
15980 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
15990 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
159a0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
159b0 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
159c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
159d0 56 66 73 20 3d 20 7b 0a 20 20 20 20 32 2c 20 20  Vfs = {.    2,  
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
15a00 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
15a10 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
15a20 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f  File */.    MAX_
15a30 50 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 20  PATH,           
15a40 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
15a50 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
15a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
15a70 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
15a80 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
15a90 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
15aa0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
15ab0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
15ac0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15ae0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
15af0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
15b00 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
15b10 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
15b20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
15b30 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
15b40 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
15b50 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
15b60 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
15b70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
15b80 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
15b90 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
15ba0 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
15bb0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15bd0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
15be0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
15bf0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
15c00 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
15c10 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
15c20 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
15c30 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
15c40 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
15c50 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
15c60 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
15c70 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
15c80 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
15c90 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
15ca0 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 30  stError */.    0
15cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15cc0 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
15cd0 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
15ce0 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
15cf0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
15d00 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74  */.  };..  sqlit
15d10 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
15d20 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72  &winVfs, 1);.  r
15d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15d40 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   .}.int sqlite3_
15d50 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20  os_end(void){ . 
15d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15d70 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
15d80 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f  SQLITE_OS_WIN */
15d90 0a                                               .