/ Hex Artifact Content
Login

Artifact 07050df9e4956f8a8bb8983788b2523fd6e7db87:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f 6e 6c 79  for windows only
0210: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f   */.../*.** A No
0220: 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79 20  te About Memory 
0230: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  Allocation:.**.*
0240: 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75 73  * This driver us
0250: 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65  es malloc()/free
0260: 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74 68  () directly rath
0270: 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74 68  er than going th
0280: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51 4c  rough.** the SQL
0290: 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71 6c  ite-wrappers sql
02a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71  ite3_malloc()/sq
02b0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20 54  lite3_free().  T
02c0: 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a 2a  hose wrappers.**
02d0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66 6f   are designed fo
02e0: 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64 65  r use on embedde
02f0: 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  d systems where 
0300: 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63 65  memory is scarce
0310: 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66   and.** malloc f
0320: 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66  ailures happen f
0330: 72 65 71 75 65 6e 74 6c 79 2e 20 20 57 69 6e 33  requently.  Win3
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 64 65 73  n windows.** des
0710: 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74 20 73 6f  ktops but not so
0720: 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65   well in embedde
0730: 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23  d systems..*/..#
0740: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65  include <winbase
0750: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59  .h>..#ifdef __CY
0760: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0770: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0780: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0790: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74  cros used to det
07a0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
07b0: 72 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72  r not to use thr
07c0: 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  eads..*/.#if def
07d0: 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
07e0: 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23   && THREADSAFE.#
07f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0800: 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  32_THREADS 1.#en
0810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75  dif../*.** Inclu
0820: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0830: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0840: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0850: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0860: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  n.h"../*.** Some
0870: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
0880: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
0890: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
08a0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
08b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
08c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
08d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
08e0: 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64  (DWORD)-1) .#end
08f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  if../*.** Determ
0900: 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64 65  ine if we are de
0910: 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64 6f  aling with Windo
0920: 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61 73  wsCE - which has
0930: 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75 63   a much.** reduc
0940: 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  ed API..*/.#if S
0950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
0960: 20 64 65 66 69 6e 65 20 41 72 65 46 69 6c 65 41   define AreFileA
0970: 70 69 73 41 4e 53 49 28 29 20 31 0a 23 20 64 65  pisANSI() 1.# de
0980: 66 69 6e 65 20 46 6f 72 6d 61 74 4d 65 73 73 61  fine FormatMessa
0990: 67 65 57 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  geW(a,b,c,d,e,f,
09a0: 67 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  g) 0.#endif../* 
09b0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
09c0: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
09d0: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
09e0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
09f0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
0a00: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
0a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a20: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
0a30: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
0a40: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
0a50: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  memory */../*.**
0a60: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0a70: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0a80: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0a90: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0aa0: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0ab0: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
0ad0: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
0ae0: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
0af0: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
0b00: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
0b10: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
0b20: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
0b30: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
0b40: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0b50: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
0b80: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
0b90: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
0ba0: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
0bb0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0bc0: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
0bd0: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0be0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0bf0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0c00: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
0c10: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
0c20: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
0c30: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
0c40: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
0c50: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
0c60: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
0c70: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
0ca0: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
0cb0: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
0cc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0cd0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
0ce0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
0cf0: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
0d00: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
0d10: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
0d20: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
0d30: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
0d60: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
0d70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
0d80: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
0d90: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
0da0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0db0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0dc0: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0dd0: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0de0: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0df0: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0e00: 63 6b 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  ck */.  DWORD la
0e10: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
0e20: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
0e30: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
0e40: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
0e50: 20 20 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69    DWORD sectorSi
0e60: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ze;       /* Sec
0e70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
0e80: 64 65 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f  device file is o
0e90: 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  n */.  winShm *p
0ea0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
0eb0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
0ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
0ed0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
0ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0ef0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0f00: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0f10: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ile */.  int szC
0f20: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
0f30: 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65 20 63   /* Chunk size c
0f40: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43 4e  onfigured by FCN
0f50: 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f  TL_CHUNK_SIZE */
0f60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
0f70: 49 4e 43 45 0a 20 20 57 43 48 41 52 20 2a 7a 44  INCE.  WCHAR *zD
0f80: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20 20 2f  eleteOnClose;  /
0f90: 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
0fa0: 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20 63 6c  o delete when cl
0fb0: 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e 44 4c  osing */.  HANDL
0fc0: 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20 20 20  E hMutex;       
0fd0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73 65 64     /* Mutex used
0fe0: 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
0ff0: 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c 6f 63  ss to shared loc
1000: 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44 4c 45 20  k */  .  HANDLE 
1010: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
1020: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
1030: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
1040: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
1050: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
1060: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
1070: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
1080: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
1090: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
10a0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
10b0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
10c0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
10d0: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
10e0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a  .#endif.};.../*.
10f0: 2a 2a 20 46 6f 72 77 61 72 64 20 70 72 6f 74 6f  ** Forward proto
1100: 74 79 70 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  types..*/.static
1110: 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53 69   int getSectorSi
1120: 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ze(.    sqlite3_
1130: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20 63  vfs *pVfs,.    c
1140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61  onst char *zRela
1150: 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46 2d  tive     /* UTF-
1160: 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29  8 file name */.)
1170: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
1180: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
1190: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
11a0: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
11b0: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
11c0: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
11d0: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
11e0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11f0: 20 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20   is Win95.** or 
1200: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
1210: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
1220: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
1230: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
1240: 73 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a  stem is Win95..*
1250: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
1260: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
1270: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
1280: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
1290: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
12a0: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
12b0: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
12c0: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
12d0: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
12e0: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
12f0: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
1300: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1310: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  int sqlite3_os_t
1320: 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ype = 0;.#else.s
1330: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1340: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
1350: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
1360: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
1370: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
1380: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
1390: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
13a0: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
13b0: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
13c0: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
13d0: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
13e0: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
13f0: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
1400: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
1410: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
1420: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
1430: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
1440: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
1450: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
1460: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
1470: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
1480: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
1490: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57  t when running W
14a0: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
14b0: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
14c0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
14d0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
14e0: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
14f0: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
1500: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
1510: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
1520: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
1530: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
1540: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
1550: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  x() API..*/.#if 
1560: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1570: 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20  # define isNT() 
1580: 20 28 31 29 0a 23 65 6c 73 65 0a 20 20 73 74 61   (1).#else.  sta
1590: 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69  tic int isNT(voi
15a0: 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  d){.    if( sqli
15b0: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29  te3_os_type==0 )
15c0: 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f  {.      OSVERSIO
15d0: 4e 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20  NINFO sInfo;.   
15e0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
15f0: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
1600: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
1610: 20 20 20 20 47 65 74 56 65 72 73 69 6f 6e 45 78      GetVersionEx
1620: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (&sInfo);.      
1630: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
1640: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f  = sInfo.dwPlatfo
1650: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f  rmId==VER_PLATFO
1660: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20  RM_WIN32_NT ? 2 
1670: 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  : 1;.    }.    r
1680: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73  eturn sqlite3_os
1690: 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65  _type==2;.  }.#e
16a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16b0: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
16c0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
16d0: 38 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72  8 string to micr
16e0: 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 28 55  osoft unicode (U
16f0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
1700: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
1710: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
1720: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
1730: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
1740: 61 74 69 63 20 57 43 48 41 52 20 2a 75 74 66 38  atic WCHAR *utf8
1750: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
1760: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1770: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
1780: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
1790: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
17a0: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
17b0: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
17c0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
17d0: 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 7a 57 69   NULL, 0);.  zWi
17e0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 6d 61 6c  deFilename = mal
17f0: 6c 6f 63 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f  loc( nChar*sizeo
1800: 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b  f(zWideFilename[
1810: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69  0]) );.  if( zWi
1820: 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  deFilename==0 ){
1830: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1840: 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 4d 75 6c   }.  nChar = Mul
1850: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
1860: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69  (CP_UTF8, 0, zFi
1870: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64  lename, -1, zWid
1880: 65 46 69 6c 65 6e 61 6d 65 2c 20 6e 43 68 61 72  eFilename, nChar
1890: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
18a0: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 57  0 ){.    free(zW
18b0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
18c0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
18d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18e0: 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
18f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
1900: 74 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63  t microsoft unic
1910: 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ode to UTF-8.  S
1920: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1930: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1940: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
1950: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  from malloc()..*
1960: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
1970: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e  nicodeToUtf8(con
1980: 73 74 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46  st WCHAR *zWideF
1990: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
19a0: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
19b0: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79  Filename;..  nBy
19c0: 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d  te = WideCharToM
19d0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
19e0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
19f0: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
1a00: 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65   0);.  zFilename
1a10: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65   = malloc( nByte
1a20: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
1a30: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1a40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
1a50: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1a60: 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46  MultiByte(CP_UTF
1a70: 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  8, 0, zWideFilen
1a80: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
1a90: 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  me, nByte,.     
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a           0, 0);.
1ac0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
1ad0: 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69   ){.    free(zFi
1ae0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
1af0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
1b00: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
1b10: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
1b20: 76 65 72 74 20 61 6e 20 61 6e 73 69 20 73 74 72  vert an ansi str
1b30: 69 6e 67 20 74 6f 20 6d 69 63 72 6f 73 6f 66 74  ing to microsoft
1b40: 20 75 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   unicode, based 
1b50: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
1b60: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
1b70: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
1b80: 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20  s..** .** Space 
1b90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
1ba0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
1bb0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
1bc0: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
1bd0: 63 20 57 43 48 41 52 20 2a 6d 62 63 73 54 6f 55  c WCHAR *mbcsToU
1be0: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
1bf0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
1c00: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 57 43   int nByte;.  WC
1c10: 48 41 52 20 2a 7a 4d 62 63 73 46 69 6c 65 6e 61  HAR *zMbcsFilena
1c20: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
1c30: 67 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73  ge = AreFileApis
1c40: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
1c50: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
1c60: 42 79 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65  Byte = MultiByte
1c70: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
1c80: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
1c90: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 30 29 2a 73  e, -1, NULL,0)*s
1ca0: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
1cb0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
1cc0: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69  malloc( nByte*si
1cd0: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
1ce0: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
1cf0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
1d00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1d10: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
1d20: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
1d30: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
1d40: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
1d50: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 20 6e  zMbcsFilename, n
1d60: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
1d70: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65  te==0 ){.    fre
1d80: 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29  e(zMbcsFilename)
1d90: 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e  ;.    zMbcsFilen
1da0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
1db0: 65 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e  eturn zMbcsFilen
1dc0: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
1dd0: 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74 20  nvert microsoft 
1de0: 75 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69  unicode to multi
1df0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
1e00: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
1e10: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 6e  the.** user's An
1e20: 73 69 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  si codepage..**.
1e30: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
1e40: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
1e50: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
1e60: 20 66 72 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 28   from.** malloc(
1e70: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
1e80: 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73  r *unicodeToMbcs
1e90: 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a 57  (const WCHAR *zW
1ea0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
1eb0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
1ec0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1ed0: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 41  int codepage = A
1ee0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
1ef0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
1f00: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
1f10: 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69   WideCharToMulti
1f20: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
1f30: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
1f40: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
1f50: 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ;.  zFilename = 
1f60: 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
1f70: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1f80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1f90: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
1fa0: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1fb0: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
1fc0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
1fd0: 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  e, -1, zFilename
1fe0: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2000: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
2010: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
2020: 7b 0a 20 20 20 20 66 72 65 65 28 7a 46 69 6c 65  {.    free(zFile
2030: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
2040: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
2050: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
2060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
2070: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
2080: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
2090: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
20a0: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
20b0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
20c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
20d0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
20e0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
20f0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
2100: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2110: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
2120: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 57 43  lenameUtf8;.  WC
2130: 48 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a  HAR *zTmpWide;..
2140: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63    zTmpWide = mbc
2150: 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  sToUnicode(zFile
2160: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
2170: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
2180: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2190: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20  zFilenameUtf8 = 
21a0: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
21b0: 6d 70 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28  mpWide);.  free(
21c0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
21d0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  urn zFilenameUtf
21e0: 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  8;.}../*.** Conv
21f0: 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c  ert UTF-8 to mul
2200: 74 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72  tibyte character
2210: 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20   string.  Space 
2220: 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20  to hold the .** 
2230: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
2240: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
2250: 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68   malloc()..*/.ch
2260: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
2270: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
2280: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2290: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
22a0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
22b0: 57 43 48 41 52 20 2a 7a 54 6d 70 57 69 64 65 3b  WCHAR *zTmpWide;
22c0: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75  ..  zTmpWide = u
22d0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
22e0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
22f0: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
2300: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2310: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
2320: 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  = unicodeToMbcs(
2330: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 66 72 65  zTmpWide);.  fre
2340: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
2350: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d  eturn zFilenameM
2360: 62 63 73 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  bcs;.}.../*.** T
2370: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2380: 6f 66 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  of getLastErrorM
2390: 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  sg.** is zero if
23a0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
23b0: 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
23c0: 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
23d0: 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
23e0: 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
23f0: 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  was truncated)..
2400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
2410: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 69 6e  tLastErrorMsg(in
2420: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2430: 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74  uf){.  /* Format
2440: 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20  Message returns 
2450: 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f  0 on failure.  O
2460: 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a  therwise it.  **
2470: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2480: 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72  ber of TCHARs wr
2490: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74  itten to the out
24a0: 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c  put.  ** buffer,
24b0: 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74   excluding the t
24c0: 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20  erminating null 
24d0: 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f  char..  */.  DWO
24e0: 52 44 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61  RD error = GetLa
24f0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 44 57 4f  stError();.  DWO
2500: 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20  RD dwLen = 0;.  
2510: 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a  char *zOut = 0;.
2520: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
2530: 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65 6d  .    WCHAR *zTem
2540: 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pWide = NULL;.  
2550: 20 20 64 77 4c 65 6e 20 3d 20 46 6f 72 6d 61 74    dwLen = Format
2560: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
2570: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
2580: 5f 42 55 46 46 45 52 20 7c 20 46 4f 52 4d 41 54  _BUFFER | FORMAT
2590: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
25a0: 53 54 45 4d 20 7c 20 46 4f 52 4d 41 54 5f 4d 45  STEM | FORMAT_ME
25b0: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
25c0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 65 72 72 6f 72 2c 0a 20 20 20 20 20 20 20    error,.       
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
2650: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
26a0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
26b0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
26c0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
26d0: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
26e0: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
26f0: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
2700: 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20  ;.      /* free 
2710: 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65  the system buffe
2720: 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46  r allocated by F
2730: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a  ormatMessage */.
2740: 20 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28        LocalFree(
2750: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
2760: 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  }./* isNT() is 1
2770: 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
2780: 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
2790: 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
27a0: 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
27b0: 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
27c0: 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
27d0: 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
27e0: 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
27f0: 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
2800: 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
2810: 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
2820: 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
2830: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2840: 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
2850: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20    char *zTemp = 
2860: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
2870: 3d 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41  = FormatMessageA
2880: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
2890: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
28a0: 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  | FORMAT_MESSAGE
28b0: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 20 46  _FROM_SYSTEM | F
28c0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
28d0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 65 72 72 6f 72 2c            error,
2920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2930: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
2960: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
29b0: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
29c0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
29d0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
29e0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
29f0: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
2a00: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
2a10: 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
2a20: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
2a30: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
2a40: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
2a50: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
2a60: 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d    LocalFree(zTem
2a70: 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  p);.    }.#endif
2a80: 0a 20 20 7d 0a 20 20 69 66 28 20 30 20 3d 3d 20  .  }.  if( 0 == 
2a90: 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  dwLen ){.    sql
2aa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2ab0: 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72  uf, zBuf, "OsErr
2ac0: 6f 72 20 30 78 25 78 20 28 25 75 29 22 2c 20 65  or 0x%x (%u)", e
2ad0: 72 72 6f 72 2c 20 65 72 72 6f 72 29 3b 0a 20 20  rror, error);.  
2ae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
2af0: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
2b00: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
2b10: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
2b20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2b30: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2b40: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
2b50: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
2b60: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
2b70: 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a  free(zOut);.  }.
2b80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
2b90: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
2ba0: 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72  ction - winLogEr
2bb0: 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73  rorAtLine() - is
2bc0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
2bd0: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
2be0: 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29  ** winLogError()
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2c00: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
2c10: 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f  after an error o
2c20: 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66  ccurs in an OS f
2c30: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c  unction..** It l
2c40: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
2c50: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
2c60: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
2c70: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
2c80: 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  f.** error code 
2c90: 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  and, if possible
2ca0: 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64  , the human-read
2cb0: 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20  able equivalent 
2cc0: 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d  from .** FormatM
2cd0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
2ce0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2cf0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
2d00: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
2d10: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
2d20: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
2d30: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
2d40: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
2d50: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
2d60: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
2d70: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
2d80: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
2d90: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
2da0: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
2db0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
2dc0: 6c 65 64 20 61 6e 64 20 74 68 65 20 74 68 65 20  led and the the 
2dd0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
2de0: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
2df0: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
2e00: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
2e10: 63 29 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  c)     winLogErr
2e20: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
2e30: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
2e40: 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  int winLogErrorA
2e50: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
2e60: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
2e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
2e80: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
2e90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2ea0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
2eb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
2ec0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
2ed0: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
2ee0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
2ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f00: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
2f10: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
2f20: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
2f50: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
2f60: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
2f70: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
2f80: 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
2f90: 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
2fa0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
2fb0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2fe0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 44 57 4f  counter */.  DWO
2ff0: 52 44 20 69 45 72 72 6e 6f 20 3d 20 47 65 74 4c  RD iErrno = GetL
3000: 61 73 74 45 72 72 6f 72 28 29 3b 20 20 2f 2a 20  astError();  /* 
3010: 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  Error code */.. 
3020: 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20   zMsg[0] = 0;.  
3030: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
3040: 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d  sizeof(zMsg), zM
3050: 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  sg);.  assert( e
3060: 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrcode!=SQLITE_O
3070: 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  K );.  if( zPath
3080: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
3090: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73  ;.  for(i=0; zMs
30a0: 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21  g[i] && zMsg[i]!
30b0: 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d  ='\r' && zMsg[i]
30c0: 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\n'; i++){}. 
30d0: 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20   zMsg[i] = 0;.  
30e0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
30f0: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77  ode,.      "os_w
3100: 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73  in.c:%d: (%d) %s
3110: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
3120: 20 20 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c    iLine, iErrno,
3130: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
3140: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
3150: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
3160: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
3170: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
3180: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
3190: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
31a0: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
31b0: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
31c0: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
31d0: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
31e0: 79 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20  y caused by .** 
31f0: 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61  antivirus softwa
3200: 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e  re.  Also the in
3210: 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f  itial delay befo
3220: 72 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74  re the first ret
3230: 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79  ry..** The delay
3240: 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61   increases linea
3250: 72 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65  rly with each re
3260: 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  try..*/.#ifndef 
3270: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
3280: 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e  RR_RETRY.# defin
3290: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
32a0: 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65  OERR_RETRY 10.#e
32b0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
32c0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
32d0: 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65  RETRY_DELAY.# de
32e0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
32f0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
3300: 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 0a 2f  LAY 25.#endif../
3310: 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69  *.** If a ReadFi
3320: 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c  le() or WriteFil
3330: 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  e() error occurs
3340: 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  , invoke this ro
3350: 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20  utine.** to see 
3360: 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  if it should be 
3370: 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e  retried.  Return
3380: 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20   TRUE to retry. 
3390: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
33a0: 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68   to give up with
33b0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
33c0: 61 74 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f  atic int retryIo
33d0: 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79  err(int *pnRetry
33e0: 29 7b 0a 20 20 44 57 4f 52 44 20 65 3b 0a 20 20  ){.  DWORD e;.  
33f0: 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 53 51  if( *pnRetry>=SQ
3400: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
3410: 5f 52 45 54 52 59 20 29 7b 0a 20 20 20 20 72 65  _RETRY ){.    re
3420: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 65 20  turn 0;.  }.  e 
3430: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
3440: 3b 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52  ;.  if( e==ERROR
3450: 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20  _LOCK_VIOLATION 
3460: 7c 7c 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52  || e==ERROR_SHAR
3470: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b  ING_VIOLATION ){
3480: 0a 20 20 20 20 53 6c 65 65 70 28 53 51 4c 49 54  .    Sleep(SQLIT
3490: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
34a0: 54 52 59 5f 44 45 4c 41 59 2a 28 31 2b 2a 70 6e  TRY_DELAY*(1+*pn
34b0: 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a  Retry));.    ++*
34c0: 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74  pnRetry;.    ret
34d0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
34e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
34f0: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
3500: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
3510: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  /.static void lo
3520: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
3530: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
3540: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
3550: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
3560: 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  , .      "delaye
3570: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
3580: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
3590: 22 2c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",.      SQLITE_
35a0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
35b0: 59 5f 44 45 4c 41 59 2a 6e 52 65 74 72 79 2a 28  Y_DELAY*nRetry*(
35c0: 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 20 20  nRetry+1)/2.    
35d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51  );.  }.}..#if SQ
35e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a  LITE_OS_WINCE./*
35f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3630: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73  ********.** This
3640: 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e   section contain
3650: 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45  s code for WinCE
3660: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   only..*/./*.** 
3670: 57 69 6e 64 6f 77 73 43 45 20 64 6f 65 73 20 6e  WindowsCE does n
3680: 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74  ot have a localt
3690: 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  ime() function. 
36a0: 20 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20   So create a.** 
36b0: 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23  substitute..*/.#
36c0: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
36d0: 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64  .struct tm *__cd
36e0: 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f  ecl localtime(co
36f0: 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b  nst time_t *t).{
3700: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
3710: 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d   tm y;.  FILETIM
3720: 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59  E uTm, lTm;.  SY
3730: 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20  STEMTIME pTm;.  
3740: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36  sqlite3_int64 t6
3750: 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20  4;.  t64 = *t;. 
3760: 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31   t64 = (t64 + 11
3770: 36 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30  644473600)*10000
3780: 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77  000;.  uTm.dwLow
3790: 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52  DateTime = (DWOR
37a0: 44 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46  D)(t64 & 0xFFFFF
37b0: 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69  FFF);.  uTm.dwHi
37c0: 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f  ghDateTime= (DWO
37d0: 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a  RD)(t64 >> 32);.
37e0: 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61    FileTimeToLoca
37f0: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
3800: 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65  lTm);.  FileTime
3810: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
3820: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
3830: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
3840: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
3850: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
3860: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
3870: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
3880: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
3890: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
38a0: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
38b0: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
38c0: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
38d0: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
38e0: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
38f0: 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  n &y;.}../* This
3900: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 63   will never be c
3910: 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66 69 6e  alled, but defin
3920: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 63  ed to make the c
3930: 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f 0a 23  ode compile */.#
3940: 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70 50 61  define GetTempPa
3950: 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66 69 6e  thA(a,b)..#defin
3960: 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63  e LockFile(a,b,c
3970: 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69 6e 63  ,d,e)       winc
3980: 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20 62 2c  eLockFile(&a, b,
3990: 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66 69 6e   c, d, e).#defin
39a0: 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61 2c 62  e UnlockFile(a,b
39b0: 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69 6e 63  ,c,d,e)     winc
39c0: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  eUnlockFile(&a, 
39d0: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66  b, c, d, e).#def
39e0: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 61  ine LockFileEx(a
39f0: 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20 77 69  ,b,c,d,e,f)   wi
3a00: 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 26 61  nceLockFileEx(&a
3a10: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20 66 29  , b, c, d, e, f)
3a20: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
3a30: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
3a40: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
3a50: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
3a60: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
3a70: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
3a80: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
3a90: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
3aa0: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
3ab0: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
3ac0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
3ad0: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
3ae0: 77 45 72 72 20 3d 20 57 61 69 74 46 6f 72 53 69  wErr = WaitForSi
3af0: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
3b00: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
3b10: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
3b20: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
3b30: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
3b40: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
3b50: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
3b60: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
3b70: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
3b80: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
3b90: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
3ba0: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
3bb0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
3bc0: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
3bd0: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
3be0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
3bf0: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
3c00: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
3c10: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43  atic BOOL winceC
3c20: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
3c30: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
3c40: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
3c50: 7b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6f 6b 3b  {.  WCHAR *zTok;
3c60: 0a 20 20 57 43 48 41 52 20 2a 7a 4e 61 6d 65 20  .  WCHAR *zName 
3c70: 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  = utf8ToUnicode(
3c80: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 42 4f  zFilename);.  BO
3c90: 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
3ca0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
3cb0: 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
3cc0: 64 61 74 61 20 2a 2f 0a 20 20 5a 65 72 6f 4d 65  data */.  ZeroMe
3cd0: 6d 6f 72 79 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mory(&pFile->loc
3ce0: 61 6c 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65  al, sizeof(pFile
3cf0: 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
3d00: 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
3d10: 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
3d20: 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
3d30: 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
3d40: 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
3d50: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
3d60: 6f 6b 20 3d 20 43 68 61 72 4c 6f 77 65 72 57 28  ok = CharLowerW(
3d70: 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b  zName);.  for (;
3d80: 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20  *zTok;zTok++){. 
3d90: 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20     if (*zTok == 
3da0: 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f  '\\') *zTok = '_
3db0: 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65  ';.  }..  /* Cre
3dc0: 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d  ate/open the nam
3dd0: 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46  ed mutex */.  pF
3de0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 43 72  ile->hMutex = Cr
3df0: 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c  eateMutexW(NULL,
3e00: 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a   FALSE, zName);.
3e10: 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
3e20: 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65  utex){.    pFile
3e30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
3e40: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
3e50: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
3e60: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 77 69 6e  LITE_ERROR, "win
3e70: 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20  ceCreateLock1", 
3e80: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
3e90: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
3ea0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20   return FALSE;. 
3eb0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
3ec0: 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72   the mutex befor
3ed0: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a  e continuing */.
3ee0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
3ef0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
3f00: 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63  x);.  .  /* Sinc
3f10: 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e  e the names of n
3f20: 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65  amed mutexes, se
3f30: 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d  maphores, file m
3f40: 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 20  appings etc are 
3f50: 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69  .  ** case-sensi
3f60: 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e  tive, take advan
3f70: 74 61 67 65 20 6f 66 20 74 68 61 74 20 62 79 20  tage of that by 
3f80: 75 70 70 65 72 63 61 73 69 6e 67 20 74 68 65 20  uppercasing the 
3f90: 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20  mutex name.  ** 
3fa0: 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20 61  and using that a
3fb0: 73 20 74 68 65 20 73 68 61 72 65 64 20 66 69 6c  s the shared fil
3fc0: 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20  emapping name.. 
3fd0: 20 2a 2f 0a 20 20 43 68 61 72 55 70 70 65 72 57   */.  CharUpperW
3fe0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
3ff0: 2d 3e 68 53 68 61 72 65 64 20 3d 20 43 72 65 61  ->hShared = Crea
4000: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
4010: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
4020: 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4050: 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45    PAGE_READWRITE
4060: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
4070: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
40a0: 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53  Name);  ..  /* S
40b0: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
40c0: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
40d0: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
40e0: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
40f0: 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62   it .  ** must b
4100: 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a  e zero-initializ
4110: 65 64 20 2a 2f 0a 20 20 69 66 20 28 47 65 74 4c  ed */.  if (GetL
4120: 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45 52  astError() == ER
4130: 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
4140: 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
4150: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 66   FALSE;.  }..  f
4160: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f  ree(zName);..  /
4170: 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65  * If we succeede
4180: 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20  d in making the 
4190: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
41a0: 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f  ndle, map it. */
41b0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53  .  if (pFile->hS
41c0: 68 61 72 65 64 29 7b 0a 20 20 20 20 70 46 69 6c  hared){.    pFil
41d0: 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e  e->shared = (win
41e0: 63 65 4c 6f 63 6b 2a 29 4d 61 70 56 69 65 77 4f  ceLock*)MapViewO
41f0: 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  fFile(pFile->hSh
4200: 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ared, .         
4210: 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41      FILE_MAP_REA
4220: 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  D|FILE_MAP_WRITE
4230: 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  , 0, 0, sizeof(w
4240: 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  inceLock));.    
4250: 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61  /* If mapping fa
4260: 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20  iled, close the 
4270: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
4280: 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69  ndle and erase i
4290: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 70 46  t */.    if (!pF
42a0: 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b 0a 20 20  ile->shared){.  
42b0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
42c0: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
42d0: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
42e0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
42f0: 45 52 52 4f 52 2c 20 22 77 69 6e 63 65 43 72 65  ERROR, "winceCre
4300: 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
4310: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 43 6c 6f  name);.      Clo
4320: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
4330: 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
4340: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
4350: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
4360: 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
4370: 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
4380: 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
4390: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
43a0: 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
43b0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61   if (pFile->hSha
43c0: 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20  red == NULL){.  
43d0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
43e0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
43f0: 78 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  x);.    CloseHan
4400: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  dle(pFile->hMute
4410: 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68  x);.    pFile->h
4420: 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  Mutex = NULL;.  
4430: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
4440: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
4450: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
4460: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
4470: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
4480: 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a  .  if (bInit) {.
4490: 20 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 70      ZeroMemory(p
44a0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 73 69  File->shared, si
44b0: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
44c0: 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
44d0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
44e0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
44f0: 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a  urn TRUE;.}../*.
4500: 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20 70  ** Destroy the p
4510: 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20 74  art of winFile t
4520: 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20 77  hat deals with w
4530: 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74  ince locks.*/.st
4540: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 44  atic void winceD
4550: 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69  estroyLock(winFi
4560: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66  le *pFile){.  if
4570: 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29   (pFile->hMutex)
4580: 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65  {.    /* Acquire
4590: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
45a0: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
45b0: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
45c0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  x);..    /* The 
45d0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73  following blocks
45e0: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
45f0: 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75 67   assert in debug
4600: 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79 0a   mode, but they.
4610: 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63 6c         are to cl
4620: 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61 6e  eanup in case an
4630: 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64  y locks remained
4640: 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20   open */.    if 
4650: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
4660: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 70  eaders){.      p
4670: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
4680: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d  eaders --;.    }
4690: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
46a0: 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
46b0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
46c0: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
46d0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
46e0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
46f0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
4700: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
4710: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
4720: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
4730: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
4740: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
4750: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
4760: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
4770: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20   FALSE;.    }.. 
4780: 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e     /* De-referen
4790: 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72  ce and close our
47a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68 61   copy of the sha
47b0: 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c  red memory handl
47c0: 65 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70 56 69  e */.    UnmapVi
47d0: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
47e0: 73 68 61 72 65 64 29 3b 0a 20 20 20 20 43 6c 6f  shared);.    Clo
47f0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
4800: 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
4810: 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
4820: 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
4830: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
4840: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20  File->hMutex);  
4850: 20 20 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64    .    CloseHand
4860: 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
4870: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
4880: 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  utex = NULL;.  }
4890: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d  .}../* .** An im
48a0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
48b0: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41  the LockFile() A
48c0: 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f  PI of windows fo
48d0: 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69  r wince.*/.stati
48e0: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
48f0: 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45 20 2a  File(.  HANDLE *
4900: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
4910: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
4920: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
4930: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
4940: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
4950: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
4960: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
4970: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
4980: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
4990: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
49a0: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
49b0: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
49c0: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
49d0: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
49e0: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
49f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
4a00: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
4a10: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
4a20: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
4a30: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
4a40: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
4a50: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
4a60: 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
4a70: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
4a80: 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
4a90: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
4aa0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
4ab0: 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
4ac0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
4ad0: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
4ae0: 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
4af0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
4b00: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
4b10: 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
4b20: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
4b30: 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
4b40: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
4b50: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
4b60: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
4b70: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
4b80: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
4b90: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
4ba0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
4bb0: 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
4bc0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
4bd0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
4be0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
4bf0: 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
4c00: 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
4c10: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
4c20: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
4c30: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
4c40: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
4c50: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
4c60: 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
4c70: 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
4c80: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
4c90: 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
4ca0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
4cb0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
4cc0: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
4cd0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
4ce0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
4cf0: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
4d00: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
4d10: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
4d20: 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
4d30: 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42  TE && nNumberOfB
4d40: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
4d50: 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
4d60: 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
4d70: 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
4d80: 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
4d90: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
4da0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
4db0: 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
4dc0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
4dd0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
4de0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
4df0: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
4e00: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
4e10: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
4e20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
4e30: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
4e40: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
4e50: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
4e60: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
4e70: 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  VED_BYTE && nNum
4e80: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
4e90: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
4ea0: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
4eb0: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
4ec0: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
4ed0: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
4ee0: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
4ef0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
4f00: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
4f10: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
4f20: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
4f30: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
4f40: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
4f50: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
4f60: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
4f70: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
4f80: 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
4f90: 69 6c 65 20 41 50 49 20 6f 66 20 77 69 6e 64 6f  ile API of windo
4fa0: 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a  ws for wince.*/.
4fb0: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
4fc0: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 48  eUnlockFile(.  H
4fd0: 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20  ANDLE *phFile,. 
4fe0: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
4ff0: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
5000: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
5010: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
5020: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
5030: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
5040: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
5050: 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
5060: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
5070: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
5080: 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
5090: 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
50a0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
50b0: 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
50c0: 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
50d0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
50e0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
50f0: 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
5100: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
5110: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
5120: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
5130: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
5140: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
5150: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72  a reader lock or
5160: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5170: 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  ck */.  if (dwFi
5180: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
5190: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
51a0: 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20  ST){.    /* Did 
51b0: 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  we have an exclu
51c0: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
51d0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
51e0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
51f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
5200: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
5210: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
5220: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20  )SHARED_SIZE);. 
5230: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
5240: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  l.bExclusive = F
5250: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
5260: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
5270: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
5280: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
5290: 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RUE;.    }..    
52a0: 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68  /* Did we just h
52b0: 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ave a reader loc
52c0: 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  k? */.    else i
52d0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
52e0: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
52f0: 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
5300: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
5310: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
5320: 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62  ED_SIZE || nNumb
5330: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
5340: 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20  kLow == 1);.    
5350: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
5360: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
5370: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
5380: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30  al.nReaders == 0
5390: 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  ).      {.      
53a0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
53b0: 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  >nReaders --;.  
53c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74      }.      bRet
53d0: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
53e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65  }.  }..  /* Rele
53f0: 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20  asing a pending 
5400: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
5410: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
5420: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
5430: 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75  DING_BYTE && nNu
5440: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
5450: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
5460: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
5470: 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
5480: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
5490: 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
54a0: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
54b0: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
54c0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
54d0: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
54e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
54f0: 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
5500: 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
5510: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
5520: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
5530: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26  )RESERVED_BYTE &
5540: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
5550: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
5560: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
5570: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
5580: 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d) {.      pFile
5590: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
55a0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
55b0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
55c0: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
55d0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
55e0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
55f0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
5600: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
5610: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
5620: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
5630: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
5640: 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
5650: 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f 66 20  FileEx() API of 
5660: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
5670: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
5680: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78   winceLockFileEx
5690: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
56a0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  le,.  DWORD dwFl
56b0: 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64 77 52  ags,.  DWORD dwR
56c0: 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f 52 44  eserved,.  DWORD
56d0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
56e0: 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  oLockLow,.  DWOR
56f0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
5700: 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20 4c 50  ToLockHigh,.  LP
5710: 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f 76 65  OVERLAPPED lpOve
5720: 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55 4e 55  rlapped.){.  UNU
5730: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
5740: 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55 4e 55  Reserved);.  UNU
5750: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
5760: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
5770: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a 20 49  ckHigh);..  /* I
5780: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77 61 6e  f the caller wan
5790: 74 73 20 61 20 73 68 61 72 65 64 20 72 65 61 64  ts a shared read
57a0: 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64 20 74   lock, forward t
57b0: 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f  his call.  ** to
57c0: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 20 2a   winceLockFile *
57d0: 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72 6c 61  /.  if (lpOverla
57e0: 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d 3d 20  pped->Offset == 
57f0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
5800: 52 53 54 20 26 26 0a 20 20 20 20 20 20 64 77 46  RST &&.      dwF
5810: 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20 20 20  lags == 1 &&.   
5820: 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65     nNumberOfByte
5830: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
5840: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
5850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  ){.    return wi
5860: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69  nceLockFile(phFi
5870: 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
5880: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
5890: 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
58a0: 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74  }./*.** End of t
58b0: 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20  he special code 
58c0: 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a  for wince.******
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
5920: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
5930: 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  CE */../********
5940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5980: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  *****.** The nex
5990: 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69  t group of routi
59a0: 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  nes implement th
59b0: 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70  e I/O methods sp
59c0: 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
59d0: 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
59e0: 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a  hods object..***
59f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
5a40: 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f 73 6f  .** Some microso
5a50: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
5a60: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
5a70: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
5a80: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
5a90: 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20  OINTER.# define 
5aa0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
5ab0: 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44  _POINTER ((DWORD
5ac0: 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  )-1).#endif../*.
5ad0: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72  ** Move the curr
5ae0: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
5af0: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
5b00: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5b10: 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
5b20: 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73   to offset iOffs
5b30: 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  et within the fi
5b40: 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
5b50: 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a  l, return 0. .**
5b60: 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
5b70: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
5b80: 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d   and return non-
5b90: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
5ba0: 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65 28  int seekWinFile(
5bb0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
5bc0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
5bd0: 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47 20 75  ffset){.  LONG u
5be0: 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  pperBits;       
5bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73            /* Mos
5c00: 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
5c10: 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
5c20: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
5c30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5c40: 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20    /* Least sig. 
5c50: 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
5c60: 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44  ffset */.  DWORD
5c70: 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20   dwRet;         
5c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
5c90: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
5ca0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
5cb0: 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74 73   */..  upperBits
5cc0: 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
5cd0: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
5ce0: 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
5cf0: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
5d00: 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
5d10: 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
5d20: 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
5d30: 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
5d40: 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
5d50: 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  word .  ** conta
5d60: 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20  ining the lower 
5d70: 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e  32-bits of the n
5d80: 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20  ew file-offset. 
5d90: 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c  Or, if it fails,
5da0: 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  .  ** it returns
5db0: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
5dc0: 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76  E_POINTER. Howev
5dd0: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
5de0: 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41  MSDN, .  ** INVA
5df0: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
5e00: 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
5e10: 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
5e20: 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
5e30: 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
5e40: 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  er an error has 
5e50: 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65 64  actually occured
5e60: 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63  , it is also nec
5e70: 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a  essary to call .
5e80: 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f    ** GetLastErro
5e90: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65  r()..  */.  dwRe
5ea0: 74 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  t = SetFilePoint
5eb0: 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77  er(pFile->h, low
5ec0: 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69  erBits, &upperBi
5ed0: 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b  ts, FILE_BEGIN);
5ee0: 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49  .  if( (dwRet==I
5ef0: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
5f00: 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61  POINTER && GetLa
5f10: 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52  stError()!=NO_ER
5f20: 52 4f 52 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ROR) ){.    pFil
5f30: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
5f40: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
5f50: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
5f60: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
5f70: 2c 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c  , "seekWinFile",
5f80: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
5f90: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
5fa0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
5fb0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
5fc0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  file..**.** It i
5fd0: 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20  s reported that 
5fe0: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c  an attempt to cl
5ff0: 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67  ose a handle mig
6000: 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ht sometimes.** 
6010: 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61  fail.  This is a
6020: 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62   very unreasonab
6030: 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 77  le result, but w
6040: 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69  indows is notori
6050: 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67  ous.** for being
6060: 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f   unreasonable so
6070: 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20   I do not doubt 
6080: 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61  that it might ha
6090: 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65  ppen.  If.** the
60a0: 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65   close fails, we
60b0: 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d   pause for 100 m
60c0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
60d0: 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a  try again.  As.*
60e0: 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f  * many as MX_CLO
60f0: 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d  SE_ATTEMPT attem
6100: 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  pts to close the
6110: 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65   handle are made
6120: 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e   before.** givin
6130: 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  g up and returni
6140: 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
6150: 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45  #define MX_CLOSE
6160: 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69  _ATTEMPT 3.stati
6170: 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73  c int winClose(s
6180: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
6190: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20  {.  int rc, cnt 
61a0: 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  = 0;.  winFile *
61b0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
61c0: 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
61d0: 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
61e0: 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
61f0: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
6200: 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 70  ("CLOSE %d\n", p
6210: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b  File->h));.  do{
6220: 0a 20 20 20 20 72 63 20 3d 20 43 6c 6f 73 65 48  .    rc = CloseH
6230: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
6240: 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
6250: 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
6260: 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
6270: 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
6280: 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
6290: 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
62a0: 54 54 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70  TTEMPT && (Sleep
62b0: 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
62c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
62d0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
62e0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
62f0: 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
6300: 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
6310: 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
6320: 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
6330: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
6340: 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
6350: 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28      DeleteFileW(
6360: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
6370: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
6380: 20 20 26 26 20 47 65 74 46 69 6c 65 41 74 74 72    && GetFileAttr
6390: 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a  ibutesW(pFile->z
63a0: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d  DeleteOnClose)!=
63b0: 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20  0xffffffff .    
63c0: 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
63d0: 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
63e0: 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
63f0: 20 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b       Sleep(100);
6400: 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
6410: 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
6420: 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
6430: 20 20 20 20 66 72 65 65 28 70 46 69 6c 65 2d 3e      free(pFile->
6440: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
6450: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
6460: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
6470: 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %s\n", pFile->h
6480: 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66  , rc ? "ok" : "f
6490: 61 69 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e  ailed"));.  Open
64a0: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
64b0: 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
64c0: 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
64d0: 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
64e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
64f0: 45 2c 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70  E, "winClose", p
6500: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
6510: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
6520: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
6530: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
6540: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
6550: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
6560: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
6570: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
6580: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
6590: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
65a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
65b0: 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
65c0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
65d0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
65e0: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
65f0: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
6600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6610: 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
6620: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
6630: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
6640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6650: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
6660: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
6670: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
6680: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
6690: 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
66a0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 77  offset */.){.  w
66b0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
66c0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
66d0: 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
66e0: 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6700: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6710: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
6720: 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
6730: 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
6740: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6750: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6760: 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
6770: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
6780: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
6790: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
67a0: 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
67b0: 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
67c0: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
67d0: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
67e0: 74 79 70 65 29 29 3b 0a 0a 20 20 69 66 28 20 73  type));..  if( s
67f0: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
6800: 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  , offset) ){.   
6810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
6820: 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
6830: 28 20 21 52 65 61 64 46 69 6c 65 28 70 46 69 6c  ( !ReadFile(pFil
6840: 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
6850: 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 20   &nRead, 0) ){. 
6860: 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72     if( retryIoer
6870: 72 28 26 6e 52 65 74 72 79 29 20 29 20 63 6f 6e  r(&nRetry) ) con
6880: 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
6890: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
68a0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
68b0: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
68c0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
68d0: 52 5f 52 45 41 44 2c 20 22 77 69 6e 52 65 61 64  R_READ, "winRead
68e0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
68f0: 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72  ;.  }.  logIoerr
6900: 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20  (nRetry);.  if( 
6910: 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74  nRead<(DWORD)amt
6920: 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   ){.    /* Unrea
6930: 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
6940: 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
6950: 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
6960: 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
6970: 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30  )pBuf)[nRead], 0
6980: 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20  , amt-nRead);.  
6990: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
69a0: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
69b0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
69c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
69d0: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
69e0: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
69f0: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
6a00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
6a10: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
6a20: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
6a30: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
6a40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6a50: 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
6a60: 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
6a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
6a80: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
6a90: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
6aa0: 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
6ab0: 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
6ac0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
6ad0: 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6af0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6b00: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
6b10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
6b20: 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
6b30: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
6b40: 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
6b50: 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
6b60: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6b90: 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63   if error has oc
6ba0: 63 75 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73  cured, else fals
6bb0: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
6bc0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
6bd0: 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68  *)id;  /* File h
6be0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  andle */.  int n
6bf0: 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
6c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6c10: 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20  mber of retries 
6c20: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d  */..  assert( am
6c30: 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
6c40: 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
6c50: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
6c60: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
6c70: 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61  WRITE);.  Simula
6c80: 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
6c90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
6ca0: 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  LL);..  OSTRACE(
6cb0: 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d  ("WRITE %d lock=
6cc0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
6cd0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
6ce0: 29 29 3b 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b  ));..  rc = seek
6cf0: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
6d00: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 61  ==0 ){.    u8 *a
6d20: 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66  Rem = (u8 *)pBuf
6d30: 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
6d40: 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
6d50: 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  en */.    int nR
6d60: 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20  em = amt;       
6d70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6d80: 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74  r of bytes yet t
6d90: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
6da0: 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65      DWORD nWrite
6db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6dc0: 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74    /* Bytes writt
6dd0: 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65  en by each Write
6de0: 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a  File() call */..
6df0: 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e      while( nRem>
6e00: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
6e10: 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
6e20: 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
6e30: 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 20  &nWrite, 0) ){. 
6e40: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
6e50: 49 6f 65 72 72 28 26 6e 52 65 74 72 79 29 20 29  Ioerr(&nRetry) )
6e60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6e70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6e80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  }.      if( nWri
6e90: 74 65 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  te<=0 ) break;. 
6ea0: 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72       aRem += nWr
6eb0: 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20  ite;.      nRem 
6ec0: 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d  -= nWrite;.    }
6ed0: 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20  .    if( nRem>0 
6ee0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
6ef0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
6f00: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
6f10: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
6f20: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
6f30: 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
6f40: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
6f50: 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
6f60: 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
6f70: 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
6f80: 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
6f90: 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
6fa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
6fb0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
6fc0: 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
6fd0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  (SQLITE_IOERR_WR
6fe0: 49 54 45 2c 20 22 77 69 6e 57 72 69 74 65 22 2c  ITE, "winWrite",
6ff0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
7000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67    }else{.    log
7010: 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
7020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7030: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7040: 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
7050: 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
7060: 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
7070: 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63  tic int winTrunc
7080: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
7090: 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
70a0: 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69  t64 nByte){.  wi
70b0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
70c0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
70d0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a   File handle obj
70e0: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
70f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7100: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7110: 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73  rn code for this
7120: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20   function */..  
7130: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
7140: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ..  OSTRACE(("TR
7150: 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e  UNCATE %d %lld\n
7160: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  ", pFile->h, nBy
7170: 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  te));.  Simulate
7180: 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
7190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
71a0: 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  CATE);..  /* If 
71b0: 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
71c0: 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
71d0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
71e0: 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
71f0: 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
7200: 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
7210: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
7220: 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
7230: 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
7240: 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
7250: 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
7260: 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
7270: 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
7280: 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
7290: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
72a0: 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >szChunk ){.    
72b0: 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
72c0: 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
72d0: 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
72e0: 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
72f0: 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
7300: 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
7310: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
7320: 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
7330: 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
7340: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
7350: 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
7360: 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
7370: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
7380: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
7390: 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 77 69 6e  R_TRUNCATE, "win
73a0: 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c  Truncate1", pFil
73b0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
73c0: 73 65 20 69 66 28 20 30 3d 3d 53 65 74 45 6e 64  se if( 0==SetEnd
73d0: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
73e0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
73f0: 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
7400: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
7410: 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
7420: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
7430: 4e 43 41 54 45 2c 20 22 77 69 6e 54 72 75 6e 63  NCATE, "winTrunc
7440: 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
7450: 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  ath);.  }..  OST
7460: 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
7470: 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70  %d %lld %s\n", p
7480: 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
7490: 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
74a0: 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
74b0: 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
74c0: 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
74d0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
74e0: 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
74f0: 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
7500: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
7510: 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
7520: 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
7530: 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
7540: 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
7550: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
7560: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
7570: 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
7580: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
7590: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
75a0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
75b0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
75c0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
75d0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
75e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
75f0: 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
7600: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
7610: 61 67 73 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  ags){.#if !defin
7620: 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
7630: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
7640: 5f 53 59 4e 43 29 20 7c 7c 20 64 65 66 69 6e 65  _SYNC) || define
7650: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
7660: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
7670: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
7680: 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6c 73  .  BOOL rc;.#els
7690: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
76a0: 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
76b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
76c0: 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
76d0: 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
76e0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
76f0: 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
7700: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
7710: 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
7720: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
7730: 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
7740: 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
7750: 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
7760: 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
7770: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
7780: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
7790: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
77a0: 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
77b0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
77c0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
77d0: 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
77e0: 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
77f0: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
7800: 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
7810: 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
7820: 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
7830: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
7840: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
7850: 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
7860: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
7870: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7880: 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
7890: 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
78a0: 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
78b0: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
78c0: 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
78d0: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
78e0: 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
78f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
7900: 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
7910: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
7920: 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
7930: 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
7940: 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
7950: 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
7960: 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
7970: 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
7980: 63 20 3d 20 46 6c 75 73 68 46 69 6c 65 42 75 66  c = FlushFileBuf
7990: 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
79a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
79b0: 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
79c0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
79d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
79e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
79f0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
7a00: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
7a10: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
7a20: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
7a30: 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 77 69 6e  OERR_FSYNC, "win
7a40: 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
7a50: 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
7a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
7a70: 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
7a80: 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
7a90: 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
7aa0: 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
7ab0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
7ac0: 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
7ad0: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f  4 *pSize){.  DWO
7ae0: 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20  RD upperBits;.  
7af0: 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
7b00: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
7b10: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
7b20: 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 3b  ;.  DWORD error;
7b30: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
7b40: 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
7b50: 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
7b60: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
7b70: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
7b80: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69   GetFileSize(pFi
7b90: 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  le->h, &upperBit
7ba0: 73 29 3b 0a 20 20 69 66 28 20 20 20 28 6c 6f 77  s);.  if(   (low
7bb0: 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
7bc0: 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
7bd0: 20 20 26 26 20 28 28 65 72 72 6f 72 20 3d 20 47    && ((error = G
7be0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20 21  etLastError()) !
7bf0: 3d 20 4e 4f 5f 45 52 52 4f 52 29 20 29 0a 20 20  = NO_ERROR) ).  
7c00: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
7c10: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
7c20: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
7c30: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
7c40: 45 52 52 5f 46 53 54 41 54 2c 20 22 77 69 6e 46  ERR_FSTAT, "winF
7c50: 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
7c60: 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 2a  >zPath);.  }.  *
7c70: 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74  pSize = (((sqlit
7c80: 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69  e3_int64)upperBi
7c90: 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72  ts)<<32) + lower
7ca0: 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53  Bits;.  return S
7cb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7cc0: 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
7cd0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
7ce0: 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
7cf0: 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
7d00: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
7d10: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
7d20: 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
7d30: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
7d40: 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
7d50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
7d60: 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
7d70: 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
7d80: 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
7d90: 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
7da0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
7db0: 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
7dc0: 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n95 or WinNT..*/
7dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52  .static int getR
7de0: 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
7df0: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
7e00: 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  es;.  if( isNT()
7e10: 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50   ){.    OVERLAPP
7e20: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c  ED ovlp;.    ovl
7e30: 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45  p.Offset = SHARE
7e40: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c  D_FIRST;.    ovl
7e50: 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30  p.OffsetHigh = 0
7e60: 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e  ;.    ovlp.hEven
7e70: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d  t = 0;.    res =
7e80: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c   LockFileEx(pFil
7e90: 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46  e->h, LOCKFILE_F
7ea0: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c  AIL_IMMEDIATELY,
7eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7ec0: 20 20 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f        0, SHARED_
7ed0: 53 49 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  SIZE, 0, &ovlp);
7ee0: 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
7ef0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7f00: 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
7f10: 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
7f20: 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53  cuted. .*/.#if S
7f30: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
7f40: 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  0.  }else{.    i
7f50: 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
7f60: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
7f70: 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
7f80: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
7f90: 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
7fa0: 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
7fb0: 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
7fc0: 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
7fd0: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69  s = LockFile(pFi
7fe0: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
7ff0: 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
8000: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
8010: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
8020: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
8030: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
8040: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
8050: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
8060: 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
8070: 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
8080: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
8090: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
80a0: 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
80b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c  /.static int unl
80c0: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46  ockReadLock(winF
80d0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
80e0: 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73  nt res;.  if( is
80f0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
8100: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69  = UnlockFile(pFi
8110: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
8120: 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
8130: 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73 4e 54  IZE, 0);./* isNT
8140: 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  () is 1 if SQLIT
8150: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73  E_OS_WINCE==1, s
8160: 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e  o this else is n
8170: 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a  ever executed. .
8180: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
8190: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
81a0: 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 55 6e 6c  e{.    res = Unl
81b0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
81c0: 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
81d0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
81e0: 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
81f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
8200: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 47 65 74  f( res==0 && Get
8210: 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52  LastError()!=ERR
8220: 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 20 29 7b  OR_NOT_LOCKED ){
8230: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
8240: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
8250: 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
8260: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
8270: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 75 6e  OERR_UNLOCK, "un
8280: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
8290: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
82a0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
82b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
82c0: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
82d0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
82e0: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
82f0: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
8300: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
8310: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
8320: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
8330: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
8340: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
8350: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
8360: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
8370: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
8380: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
8390: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
83a0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
83b0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
83c0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
83d0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
83e0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
83f0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
8400: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
8410: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
8420: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
8430: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
8440: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
8450: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
8460: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
8470: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
8480: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
8490: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
84a0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
84b0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
84c0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
84d0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
84e0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
84f0: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
8500: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
8510: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
8520: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
8530: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
8540: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
8550: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
8560: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
8570: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
8580: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
8590: 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
85a0: 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
85b0: 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
85c0: 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
85d0: 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
85e0: 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
85f0: 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
8600: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
8610: 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
8620: 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
8630: 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
8640: 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
8650: 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
8660: 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
8670: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
8680: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
8690: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
86a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
86b0: 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
86c0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
86d0: 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
86e0: 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
86f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
8700: 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a windows lock
8710: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
8720: 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
8730: 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
8740: 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
8750: 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
8760: 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
8770: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
8780: 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
8790: 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
87a0: 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
87b0: 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
87c0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
87d0: 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72  *)id;.  DWORD er
87e0: 72 6f 72 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  ror = NO_ERROR;.
87f0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
8800: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
8810: 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20 25  LOCK %d %d was %
8820: 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20  d(%d)\n",.      
8830: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
8840: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
8850: 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
8860: 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
8870: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
8880: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
8890: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
88a0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
88b0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
88c0: 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
88d0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
88e0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
88f0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
8900: 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
8910: 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
8920: 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
8930: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
8940: 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
8950: 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  pe ){.    return
8960: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8970: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
8980: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
8990: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
89a0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
89b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
89c0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
89d0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
89e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
89f0: 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
8a00: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
8a10: 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
8a20: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
8a30: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
8a40: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
8a50: 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
8a60: 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
8a70: 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
8a80: 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
8a90: 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
8aa0: 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
8ab0: 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
8ac0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
8ad0: 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
8ae0: 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
8af0: 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
8b00: 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
8b10: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
8b20: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
8b30: 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d 3e    if(   (pFile->
8b40: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
8b50: 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20 28  K).     || (   (
8b60: 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
8b70: 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  IVE_LOCK).      
8b80: 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f     && (pFile->lo
8b90: 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
8ba0: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
8bb0: 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
8bc0: 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
8bd0: 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46   && (res = LockF
8be0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
8bf0: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
8c00: 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
8c10: 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
8c20: 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
8c30: 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70  ing lock.  The p
8c40: 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68  ending lock migh
8c50: 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 68 65  t be.      ** he
8c60: 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 72 65  ld by another re
8c70: 61 64 65 72 20 70 72 6f 63 65 73 73 20 77 68 6f  ader process who
8c80: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 69 74   will release it
8c90: 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20   momentarily..  
8ca0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54      */.      OST
8cb0: 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74  RACE(("could not
8cc0: 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c   get a PENDING l
8cd0: 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20  ock. cnt=%d\n", 
8ce0: 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 53 6c 65  cnt));.      Sle
8cf0: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
8d00: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
8d10: 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
8d20: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 65 72 72  res ){.      err
8d30: 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
8d40: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
8d50: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
8d60: 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
8d70: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
8d80: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
8d90: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
8da0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
8db0: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
8dc0: 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
8dd0: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
8de0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
8df0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
8e00: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
8e10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72 72  }else{.      err
8e20: 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  or = GetLastErro
8e30: 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
8e40: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
8e50: 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
8e60: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
8e70: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
8e80: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
8e90: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
8ea0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
8eb0: 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
8ec0: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
8ed0: 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
8ee0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
8ef0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
8f00: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
8f10: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
8f20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
8f30: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
8f40: 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
8f50: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
8f60: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
8f70: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
8f80: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
8f90: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
8fa0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
8fb0: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
8fc0: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
8fd0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
8fe0: 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
8ff0: 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
9000: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
9010: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
9020: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
9030: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
9040: 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
9050: 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f  ;.    res = unlo
9060: 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
9070: 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
9080: 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64  "unreadlock = %d
9090: 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20 20  \n", res));.    
90a0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
90b0: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
90c0: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
90d0: 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
90e0: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
90f0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
9100: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
9110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
9120: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
9130: 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
9140: 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64  RACE(("error-cod
9150: 65 20 3d 20 25 64 5c 6e 22 2c 20 65 72 72 6f 72  e = %d\n", error
9160: 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61  ));.      getRea
9170: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
9180: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9190: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
91a0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
91b0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
91c0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
91d0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
91e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
91f0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
9200: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
9210: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  D_LOCK ){.    Un
9220: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
9230: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
9240: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
9250: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
9260: 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
9270: 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
9280: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9290: 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
92a0: 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
92b0: 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
92c0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
92d0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
92e0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
92f0: 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
9300: 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69  K FAILED %d tryi
9310: 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f  ng for %d but go
9320: 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t %d\n", pFile->
9330: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
9340: 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
9350: 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65  ype));.    pFile
9360: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
9370: 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ror;.    rc = SQ
9380: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
9390: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
93a0: 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
93b0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
93c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
93d0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
93e0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
93f0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
9400: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
9410: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
9420: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
9430: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
9440: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
9450: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
9460: 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
9470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9480: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
9490: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
94a0: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
94b0: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
94c0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
94d0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
94e0: 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
94f0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
9500: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
9510: 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
9520: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
9530: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
9540: 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
9550: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
9560: 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
9570: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
9580: 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
9590: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
95a0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
95b0: 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70   rc = LockFile(p
95c0: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
95d0: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
95e0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
95f0: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65        UnlockFile
9600: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
9610: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
9620: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
9630: 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52   = !rc;.    OSTR
9640: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
9650: 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
9660: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
9670: 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
9680: 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
9690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
96a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
96b0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
96c0: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
96d0: 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
96e0: 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
96f0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
9700: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
9710: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
9720: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
9730: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
9740: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
9750: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
9760: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
9770: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
9780: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9790: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
97a0: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
97b0: 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
97c0: 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
97d0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
97e0: 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
97f0: 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
9800: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
9810: 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
9820: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
9830: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
9840: 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
9850: 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
9860: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
9870: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
9880: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
9890: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
98a0: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
98b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
98c0: 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
98d0: 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
98e0: 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
98f0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
9900: 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
9910: 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28  %d to %d was %d(
9920: 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
9930: 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
9940: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
9950: 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
9960: 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a  aredLockByte));.
9970: 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
9980: 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
9990: 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
99a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
99b0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
99c0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
99d0: 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
99e0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  );.    if( lockt
99f0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
9a00: 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b   && !getReadLock
9a10: 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
9a20: 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
9a30: 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
9a40: 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
9a50: 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
9a60: 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
9a70: 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
9a80: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
9a90: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
9aa0: 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 77 69 6e 55  RR_UNLOCK, "winU
9ab0: 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
9ac0: 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
9ad0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
9ae0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
9af0: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69    UnlockFile(pFi
9b00: 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
9b10: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
9b20: 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79    }.  if( lockty
9b30: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74  pe==NO_LOCK && t
9b40: 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
9b50: 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65   ){.    unlockRe
9b60: 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
9b70: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
9b80: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
9b90: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
9ba0: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
9bb0: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
9bc0: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
9bd0: 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
9be0: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
9bf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  c;.}../*.** Cont
9c00: 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
9c10: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
9c20: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
9c30: 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
9c40: 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
9c50: 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
9c60: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
9c70: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
9c80: 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
9c90: 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
9ca0: 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
9cb0: 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29  = ((winFile*)id)
9cc0: 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
9cd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ce0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
9cf0: 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  se SQLITE_LAST_E
9d00: 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28  RRNO: {.      *(
9d10: 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74  int*)pArg = (int
9d20: 29 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d  )((winFile*)id)-
9d30: 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
9d40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9d50: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
9d60: 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
9d70: 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
9d80: 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 69      ((winFile*)i
9d90: 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  d)->szChunk = *(
9da0: 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
9db0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9dc0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
9dd0: 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
9de0: 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
9df0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
9e00: 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f   sz = *(sqlite3_
9e10: 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
9e20: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
9e30: 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
9e40: 20 20 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69     winTruncate(i
9e50: 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 53 69  d, sz);.      Si
9e60: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
9e70: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65  ign(0);.      re
9e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
9e90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
9ea0: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e 43  QLITE_FCNTL_SYNC
9eb0: 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20 20 20  _OMITTED: {.    
9ec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9ed0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
9ee0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9ef0: 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
9f00: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
9f10: 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
9f20: 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
9f30: 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
9f40: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
9f50: 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
9f60: 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
9f70: 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
9f80: 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
9f90: 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
9fa0: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
9fb0: 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
9fc0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
9fd0: 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
9fe0: 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
9ff0: 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
a000: 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
a010: 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
a020: 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
a030: 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
a040: 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
a050: 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
a060: 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
a070: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
a080: 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
a090: 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
a0a0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
a0b0: 20 2a 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28   *id){.  assert(
a0c0: 20 69 64 21 3d 30 20 29 3b 0a 20 20 72 65 74 75   id!=0 );.  retu
a0d0: 72 6e 20 28 69 6e 74 29 28 28 28 77 69 6e 46 69  rn (int)(((winFi
a0e0: 6c 65 2a 29 69 64 29 2d 3e 73 65 63 74 6f 72 53  le*)id)->sectorS
a0f0: 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ize);.}../*.** R
a100: 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
a110: 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
a120: 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
a130: 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
a140: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
a150: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
a160: 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
a170: 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65  AMETER(id);.  re
a180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
a190: 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
a1a0: 45 4e 5f 4f 50 45 4e 3b 0a 7d 0a 0a 23 69 66 6e  EN_OPEN;.}..#ifn
a1b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a1c0: 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64  WAL../* .** Wind
a1d0: 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65  ows will only le
a1e0: 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c  t you create fil
a1f0: 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a  e view mappings.
a200: 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  ** on allocation
a210: 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74   size granularit
a220: 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a  y boundaries..**
a230: 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   During sqlite3_
a240: 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20  os_init() we do 
a250: 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  a GetSystemInfo(
a260: 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20  ).** to get the 
a270: 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65  granularity size
a280: 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f  ..*/.SYSTEM_INFO
a290: 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a   winSysInfo;../*
a2a0: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
a2b0: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
a2c0: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
a2d0: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
a2e0: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
a2f0: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
a300: 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f  rotect the winLo
a310: 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75  ckInfo objects u
a320: 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20  sed by .** this 
a330: 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
a340: 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
a350: 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
a360: 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
a370: 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
a380: 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
a390: 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
a3a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
a3b0: 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
a3c0: 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
a3d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
a3e0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
a3f0: 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
a400: 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
a410: 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
a420: 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
a430: 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
a440: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
a450: 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
a460: 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
a470: 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
a480: 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
a490: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
a4a0: 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
a4b0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
a4c0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
a4d0: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
a4e0: 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
a4f0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
a500: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a510: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a520: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
a530: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
a540: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
a550: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
a560: 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
a570: 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
a580: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
a590: 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
a5a0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
a5b0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
a5c0: 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  R));.}.#endif../
a5d0: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
a5e0: 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
a5f0: 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
a600: 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
a610: 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
a620: 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
a630: 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
a640: 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
a650: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
a660: 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
a670: 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
a680: 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
a690: 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
a6a0: 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
a6b0: 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
a6c0: 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
a6d0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
a6e0: 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
a6f0: 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
a700: 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
a710: 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
a720: 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
a730: 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
a740: 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
a750: 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
a760: 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
a770: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
a780: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
a790: 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
a7a0: 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
a7b0: 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  xt .**.** The fo
a7c0: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
a7d0: 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
a7e0: 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
a7f0: 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
a800: 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
a810: 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
a820: 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e  * Either winShmN
a830: 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
a840: 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d  e held or winShm
a850: 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
a860: 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
a870: 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
a880: 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
a890: 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
a8a0: 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
a8b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
a8c0: 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  /.struct winShmN
a8d0: 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode {.  sqlite3_
a8e0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
a8f0: 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
a900: 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
a910: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
a920: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
a930: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
a940: 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69   file */.  winFi
a950: 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20  le hFile;       
a960: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
a970: 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65  ndle from winOpe
a980: 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65  n */..  int szRe
a990: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
a9a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
a9b0: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
a9c0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
a9d0: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
a9e0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
a9f0: 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
aa00: 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
aa10: 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
aa20: 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
aa30: 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
aa40: 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
aa50: 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
aa60: 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
aa70: 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
aa80: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
aa90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
aaa0: 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
aab0: 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
aac0: 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
aad0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
aae0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aaf0: 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
ab00: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
ab10: 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
ab20: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
ab30: 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
ab40: 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
ab50: 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
ab60: 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
ab70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
ab80: 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
ab90: 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
aba0: 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ts */.#ifdef SQL
abb0: 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e  ITE_DEBUG.  u8 n
abc0: 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
abd0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
abe0: 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e  vailable winShm.
abf0: 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
ac00: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  if.};../*.** A g
ac10: 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61  lobal array of a
ac20: 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
ac30: 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  jects..**.** The
ac40: 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
ac50: 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
ac60: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
ac70: 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69   writing this li
ac80: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69  st..*/.static wi
ac90: 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d  nShmNode *winShm
aca0: 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  NodeList = 0;../
acb0: 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
acc0: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
acd0: 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
ace0: 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
acf0: 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
ad00: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
ad10: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
ad20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
ad30: 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
ad40: 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
ad50: 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
ad60: 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
ad70: 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
ad80: 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70  *.**    winShm.p
ad90: 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69  ShmNode.**    wi
ada0: 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  nShm.id.**.** Al
adb0: 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
adc0: 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
add0: 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e  The winShm.pShmN
ade0: 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ode->mutex must 
adf0: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
ae00: 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
ae10: 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
ae20: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  ..*/.struct winS
ae30: 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  hm {.  winShmNod
ae40: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
ae50: 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
ae60: 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  ing winShmNode o
ae70: 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68  bject */.  winSh
ae80: 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
ae90: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69        /* Next wi
aea0: 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  nShm with the sa
aeb0: 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  me winShmNode */
aec0: 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aee0: 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
aef0: 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
af00: 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
af10: 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
af20: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
af30: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
af40: 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
af50: 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
af60: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
af70: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
af80: 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ld */.#ifdef SQL
af90: 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69  ITE_DEBUG.  u8 i
afa0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
afb0: 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
afc0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
afd0: 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
afe0: 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
aff0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
b000: 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
b010: 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
b020: 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
b030: 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
b040: 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
b050: 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
b060: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
b070: 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
b080: 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
b090: 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
b0a0: 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
b0b0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
b0c0: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
b0d0: 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
b0e0: 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
b0f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f  */.#define _SHM_
b100: 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
b110: 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23   _SHM_RDLCK  2.#
b120: 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
b130: 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  K  3.static int 
b140: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
b150: 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  (.  winShmNode *
b160: 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70  pFile,    /* App
b170: 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
b180: 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
b190: 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
b1a0: 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
b1b0: 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55         /* _SHM_U
b1c0: 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  NLCK, _SHM_RDLCK
b1d0: 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  , or _SHM_WRLCK 
b1e0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b200: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
b210: 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
b220: 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
b230: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
b240: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b250: 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
b260: 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
b270: 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70   OVERLAPPED ovlp
b280: 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
b290: 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  s;.  int rc = 0;
b2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b2b0: 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
b2c0: 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
b2d0: 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
b2e0: 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
b2f0: 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
b300: 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
b310: 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
b320: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b330: 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
b340: 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
b350: 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
b360: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b370: 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
b380: 72 73 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20  rs */.  dwFlags 
b390: 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  = LOCKFILE_FAIL_
b3a0: 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69  IMMEDIATELY;.  i
b3b0: 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
b3c0: 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
b3d0: 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
b3e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
b3f0: 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c  .  memset(&ovlp,
b400: 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
b410: 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e  APPED));.  ovlp.
b420: 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a  Offset = ofst;..
b430: 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
b440: 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
b450: 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
b460: 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
b470: 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
b480: 72 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45  rc = UnlockFileE
b490: 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  x(pFile->hFile.h
b4a0: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26  , 0, nByte, 0, &
b4b0: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
b4c0: 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c      rc = LockFil
b4d0: 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65  eEx(pFile->hFile
b4e0: 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20  .h, dwFlags, 0, 
b4f0: 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29  nByte, 0, &ovlp)
b500: 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  ;.  }.  .  if( r
b510: 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
b520: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
b530: 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
b540: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 47 65  >lastErrno =  Ge
b550: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
b560: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
b570: 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
b580: 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
b590: 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e   %s %s 0x%08lx\n
b5a0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  ", .           p
b5b0: 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
b5c0: 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
b5d0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
b5e0: 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20   "failed",.     
b5f0: 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d        lockType==
b600: 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e  _SHM_UNLCK ? "Un
b610: 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c  lockFileEx" : "L
b620: 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20  ockFileEx",.    
b630: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
b640: 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65  stErrno));..  re
b650: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
b660: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
b670: 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
b680: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
b690: 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
b6a0: 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
b6b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
b6c0: 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
b6d0: 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
b6e0: 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
b6f0: 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
b700: 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
b710: 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
b720: 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
b730: 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
b740: 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
b750: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
b760: 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
b770: 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
b780: 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
b790: 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
b7a0: 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
b7b0: 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
b7c0: 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
b7d0: 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
b7e0: 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
b7f0: 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
b800: 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
b810: 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42  nShmNode *p;.  B
b820: 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72  OOL bRc;.  asser
b830: 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
b840: 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26  ld() );.  pp = &
b850: 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
b860: 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
b870: 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
b880: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
b890: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b8a0: 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
b8b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
b8c0: 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
b8d0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b8e0: 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
b8f0: 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
b900: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
b910: 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
b920: 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
b930: 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
b940: 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65   pid-%d unmap re
b950: 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  gion=%d %s\n",. 
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50  (int)GetCurrentP
b980: 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20  rocessId(), i,. 
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
b9b0: 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
b9c0: 20 62 52 63 20 3d 20 43 6c 6f 73 65 48 61 6e 64   bRc = CloseHand
b9d0: 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
b9e0: 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .hMap);.        
b9f0: 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
ba00: 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65  RGE pid-%d close
ba10: 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22   region=%d %s\n"
ba20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba30: 20 20 20 28 69 6e 74 29 47 65 74 43 75 72 72 65     (int)GetCurre
ba40: 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
ba50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba60: 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20     bRc ? "ok" : 
ba70: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
ba80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
ba90: 3e 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56 41  >hFile.h != INVA
baa0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
bab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
bac0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
bad0: 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
bae0: 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
baf0: 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
bb00: 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
bb10: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
bb20: 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
bb30: 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
bb40: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
bb50: 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
bb60: 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77  gn(1);.        w
bb70: 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  inDelete(pVfs, p
bb80: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b  ->zFilename, 0);
bb90: 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
bba0: 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
bbb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bbc0: 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
bbd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
bbe0: 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
bbf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
bc00: 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
bc10: 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
bc20: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
bc30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
bc40: 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
bc50: 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
bc60: 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
bc70: 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
bc80: 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
bc90: 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
bca0: 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
bcb0: 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
bcc0: 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
bcd0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
bce0: 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
bcf0: 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
bd00: 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
bd10: 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
bd20: 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
bd30: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
bd40: 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
bd50: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
bd60: 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
bd70: 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
bd80: 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
bd90: 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
bdc0: 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
bdd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
bde0: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
bdf0: 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
be00: 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
be10: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
be20: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be40: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
be50: 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
be60: 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
be70: 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
be80: 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
be90: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
bea0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bec0: 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
bed0: 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
bee0: 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
bef0: 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
bf00: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
bf10: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
bf20: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
bf30: 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
bf40: 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
bf50: 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
bf60: 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
bf70: 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
bf80: 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
bf90: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
bfa0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
bfb0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
bfc0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
bfd0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
bfe0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
bff0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e  izeof(*p));.  nN
c000: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
c010: 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61  len30(pDbFd->zPa
c020: 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  th);.  pNew = sq
c030: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
c040: 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
c050: 2b 20 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a  + nName + 15 );.
c060: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
c070: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
c080: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
c090: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c0a0: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77   }.  memset(pNew
c0b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
c0c0: 77 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  w));.  pNew->zFi
c0d0: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
c0e0: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
c0f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
c100: 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
c110: 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
c120: 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
c130: 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
c140: 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
c150: 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
c160: 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f  ame); ..  /* Loo
c170: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
c180: 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
c190: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
c1a0: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
c1b0: 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
c1c0: 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
c1d0: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
c1e0: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
c1f0: 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
c200: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
c210: 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
c220: 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
c230: 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
c240: 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
c250: 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
c260: 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
c270: 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
c280: 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
c290: 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
c2a0: 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
c2b0: 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
c2c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c2d0: 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
c2e0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
c2f0: 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
c300: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
c310: 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
c320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c330: 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
c340: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
c350: 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
c360: 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
c370: 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
c380: 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
c390: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
c3a0: 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
c3b0: 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
c3c0: 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
c3d0: 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
c3e0: 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
c3f0: 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
c400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
c410: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
c420: 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
c430: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
c440: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
c450: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
c460: 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
c470: 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
c480: 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
c490: 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
c4a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
c4b0: 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
c4e0: 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
c500: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
c510: 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
c520: 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
c530: 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
c540: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
c550: 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
c560: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
c570: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
c580: 41 54 45 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61  ATE, /* Mode fla
c590: 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  gs */.          
c5a0: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
c5b0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
c5c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
c5d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
c5e0: 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
c5f0: 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
c600: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
c610: 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
c620: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
c630: 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
c640: 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
c650: 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63  ** If not, trunc
c660: 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
c670: 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20  zero length. .  
c680: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e    */.    if( win
c690: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
c6a0: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
c6b0: 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
c6c0: 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   1)==SQLITE_OK )
c6d0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
c6e0: 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
c6f0: 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
c700: 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20  de->hFile, 0);. 
c710: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c720: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c730: 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
c740: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
c750: 53 48 4d 4f 50 45 4e 2c 20 22 77 69 6e 4f 70 65  SHMOPEN, "winOpe
c760: 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  nShm", pDbFd->zP
c770: 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
c780: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
c790: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c7a0: 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c     winShmSystemL
c7b0: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
c7c0: 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
c7d0: 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
c7e0: 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
c7f0: 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
c800: 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e   _SHM_RDLCK, WIN
c810: 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
c820: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
c830: 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
c840: 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rr;.  }..  /* Ma
c850: 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
c860: 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
c870: 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
c880: 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
c890: 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
c8a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c8b0: 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
c8c0: 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
c8d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
c8e0: 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
c8f0: 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
c900: 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
c910: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
c920: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
c930: 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
c940: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
c950: 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
c960: 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
c970: 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72   the winShmEnter
c980: 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
c990: 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
c9a0: 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
c9b0: 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20  (struct winShm) 
c9c0: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
c9d0: 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
c9e0: 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
c9f0: 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
ca00: 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
ca10: 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
ca20: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
ca30: 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
ca40: 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
ca50: 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
ca60: 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
ca70: 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
ca80: 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
ca90: 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
caa0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
cab0: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
cac0: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
cad0: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
cae0: 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
caf0: 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
cb00: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
cb10: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
cb20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cb30: 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
cb40: 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
cb50: 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
cb60: 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  :.  winShmSystem
cb70: 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
cb80: 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
cb90: 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69  HM_DMS, 1);.  wi
cba0: 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d  nShmPurge(pDbFd-
cbb0: 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20  >pVfs, 0);      
cbc0: 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
cbd0: 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
cbe0: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
cbf0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
cc00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
cc10: 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  w);.  winShmLeav
cc20: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
cc30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cc40: 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
cc50: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
cc60: 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
cc70: 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
cc80: 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
cc90: 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
cca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
ccb0: 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
ccc0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
ccd0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
cce0: 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
ccf0: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
cd00: 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
cd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
cd20: 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67  te after closing
cd30: 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
cd40: 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
cd50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
cd60: 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
cd70: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d-memory */.  wi
cd80: 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
cd90: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
cda0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
cdb0: 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  ed */.  winShmNo
cdc0: 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
cdd0: 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
cde0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
cdf0: 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  le */.  winShm *
ce00: 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
ce10: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
ce20: 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
ce30: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46  tions */..  pDbF
ce40: 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
ce50: 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
ce60: 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
ce70: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ce80: 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
ce90: 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
cea0: 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
ceb0: 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
cec0: 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
ced0: 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
cee0: 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
cef0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
cf00: 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
cf10: 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
cf20: 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
cf30: 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
cf40: 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
cf50: 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
cf60: 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
cf70: 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
cf80: 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
cf90: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
cfa0: 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
cfb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cfc0: 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
cfd0: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
cfe0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
cff0: 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
d000: 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
d010: 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
d020: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
d030: 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68  , too */.  winSh
d040: 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
d050: 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
d060: 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
d070: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
d080: 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
d090: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
d0a0: 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
d0b0: 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46  d->pVfs, deleteF
d0c0: 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53  lag);.  }.  winS
d0d0: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
d0e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d0f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
d100: 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
d110: 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
d120: 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
d130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
d140: 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  inShmLock(.  sql
d150: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
d160: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
d170: 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
d180: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
d190: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
d1a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d1b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
d1c0: 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
d1d0: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
d1e0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
d1f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d200: 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
d210: 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
d220: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
d250: 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
d260: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
d270: 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
d280: 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  d;        /* Con
d290: 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
d2a0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
d2b0: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
d2c0: 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
d2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d2e0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
d2f0: 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
d300: 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  winShm *pX;     
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
d330: 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
d340: 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53  blings */.  winS
d350: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
d360: 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
d370: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d380: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
d390: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
d3a0: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
d3b0: 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
d3e0: 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
d3f0: 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
d400: 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
d410: 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
d420: 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
d430: 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
d440: 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
d450: 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
d460: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
d470: 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
d480: 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
d490: 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
d4a0: 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
d4b0: 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
d4c0: 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
d4d0: 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
d4e0: 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
d4f0: 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
d500: 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
d510: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
d520: 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
d530: 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
d540: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
d550: 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
d560: 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55  mask = (u16)((1U
d570: 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
d580: 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73  U<<ofst));.  ass
d590: 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
d5a0: 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
d5b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d5c0: 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
d5d0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
d5e0: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
d5f0: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
d600: 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
d610: 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
d620: 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
d630: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
d640: 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
d650: 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
d660: 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
d670: 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
d680: 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
d690: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
d6a0: 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
d6b0: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
d6c0: 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
d6d0: 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
d6e0: 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
d6f0: 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
d700: 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
d710: 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
d720: 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
d730: 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
d740: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
d750: 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
d760: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
d770: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
d780: 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
d790: 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
d7a0: 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
d7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
d7c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d7d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
d7e0: 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
d7f0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
d800: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d810: 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
d820: 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
d830: 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
d840: 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
d850: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
d860: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
d870: 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
d880: 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
d890: 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
d8a0: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
d8b0: 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
d8c0: 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
d8d0: 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
d8e0: 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
d8f0: 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
d900: 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
d910: 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
d920: 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
d930: 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
d940: 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
d950: 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
d960: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
d970: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
d980: 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
d990: 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
d9a0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
d9b0: 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
d9c0: 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
d9d0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d9e0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
d9f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
da00: 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
da10: 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
da20: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
da30: 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
da40: 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
da50: 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
da60: 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
da70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
da80: 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
da90: 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
daa0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
dab0: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
dac0: 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
dad0: 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  RDLCK, ofst+WIN_
dae0: 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
daf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db00: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
db10: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
db20: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
db30: 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
db40: 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
db50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
db60: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
db70: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
db80: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
db90: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
dba0: 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
dbb0: 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
dbc0: 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
dbd0: 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
dbe0: 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
dbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
dc00: 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
dc10: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
dc20: 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
dc30: 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
dc40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
dc50: 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
dc60: 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
dc70: 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
dc80: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
dc90: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
dca0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dcb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dcc0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
dcd0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
dce0: 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
dcf0: 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
dd00: 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
dd10: 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
dd20: 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
dd30: 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
dd40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
dd50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dd60: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
dd70: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
dd80: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
dd90: 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
dda0: 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
ddb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ddc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
ddd0: 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
dde0: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
ddf0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
de00: 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
de10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
de20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
de30: 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
de40: 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
de50: 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d  E(("SHM-LOCK shm
de60: 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f  id-%d, pid-%d go
de70: 74 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e  t %03x,%03x %s\n
de80: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
de90: 3e 69 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72  >id, (int)GetCur
dea0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
deb0: 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
dec0: 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20  p->exclMask,.   
ded0: 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66 61          rc ? "fa
dee0: 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
def0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
df00: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
df10: 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
df20: 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
df30: 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
df40: 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
df50: 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
df60: 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
df70: 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
df80: 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
df90: 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
dfa0: 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
dfb0: 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
dfc0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
dfd0: 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
dfe0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
dff0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
e000: 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
e010: 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
e020: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
e030: 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d  ETER(fd);.  /* M
e040: 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
e050: 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
e060: 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
e070: 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
e080: 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
e090: 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
e0a0: 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
e0b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
e0c0: 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
e0d0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
e0e0: 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
e0f0: 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
e100: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
e110: 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
e120: 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
e130: 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
e140: 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
e150: 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
e160: 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
e170: 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
e180: 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
e190: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
e1a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
e1b0: 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
e1c0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
e1d0: 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
e1e0: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
e1f0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
e200: 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72   the isWrite par
e210: 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
e220: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
e230: 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
e240: 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
e250: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
e260: 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
e270: 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
e280: 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
e290: 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
e2a0: 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
e2b0: 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
e2c0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
e2d0: 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20   .** isWrite is 
e2e0: 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
e2f0: 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
e300: 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
e310: 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
e320: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
e330: 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
e340: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
e350: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
e360: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
e370: 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
e380: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
e390: 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
e3a0: 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
e3b0: 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
e3c0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
e3d0: 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
e3e0: 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
e3f0: 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
e400: 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
e410: 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
e420: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
e430: 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
e440: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
e450: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
e460: 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28  c int winShmMap(
e470: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
e480: 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
e490: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
e4a0: 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
e4b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
e4c0: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
e4d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
e4e0: 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
e4f0: 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
e520: 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  gions */.  int i
e530: 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  sWrite,         
e540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
e550: 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
e560: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
e570: 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
e580: 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
e590: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
e5a0: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
e5b0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
e5c0: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
e5d0: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
e5e0: 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69  DbFd->pShm;.  wi
e5f0: 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
e600: 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
e610: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
e620: 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   !p ){.    rc = 
e630: 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
e640: 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
e650: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e660: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
e670: 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53     p = pDbFd->pS
e680: 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f  hm;.  }.  pShmNo
e690: 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
e6a0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
e6b0: 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
e6c0: 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
e6d0: 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
e6e0: 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
e6f0: 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
e700: 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
e710: 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
e720: 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
e730: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d  {.    struct Shm
e740: 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20  Region *apNew;  
e750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
e760: 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  aRegion[] array 
e770: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
e780: 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
e790: 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
e7a0: 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
e7b0: 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
e7c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
e7f0: 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66  e of wal-index f
e800: 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  ile */..    pShm
e810: 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
e820: 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
e830: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
e840: 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
e850: 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
e860: 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
e870: 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
e880: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
e890: 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
e8a0: 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
e8b0: 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
e8c0: 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
e8d0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
e8e0: 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
e8f0: 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
e900: 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  /.    rc = winFi
e910: 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
e920: 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
e930: 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20  ->hFile, &sz);. 
e940: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
e960: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
e970: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
e980: 49 5a 45 2c 20 22 77 69 6e 53 68 6d 4d 61 70 31  IZE, "winShmMap1
e990: 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
e9a0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
e9b0: 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
e9c0: 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74  .    if( sz<nByt
e9d0: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
e9e0: 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
e9f0: 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
ea00: 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57  ot exist. If isW
ea10: 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20  rite is set to. 
ea20: 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78       ** zero, ex
ea30: 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
ea40: 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
ea50: 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
ea60: 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
ea70: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  **.      ** Alte
ea80: 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73  rnatively, if is
ea90: 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
eaa0: 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  o, use ftruncate
eab0: 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
eac0: 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
ead0: 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
eae0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
eaf0: 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65      if( !isWrite
eb00: 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
eb10: 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  out;.      rc = 
eb20: 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
eb30: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
eb40: 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42  mNode->hFile, nB
eb50: 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
eb60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
eb70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
eb80: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
eb90: 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
eba0: 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44  "winShmMap2", pD
ebb0: 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
ebc0: 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
ebd0: 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
ebe0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
ebf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
ec00: 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
ec10: 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
ec20: 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
ec30: 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
ec40: 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
ec50: 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   *)sqlite3_reall
ec60: 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
ec70: 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28  Node->aRegion, (
ec80: 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
ec90: 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20  f(apNew[0]).    
eca0: 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
ecb0: 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
ecc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
ecd0: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
ece0: 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
ecf0: 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
ed00: 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  aRegion = apNew;
ed10: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68  ..    while( pSh
ed20: 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
ed30: 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  iRegion ){.     
ed40: 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20   HANDLE hMap;   
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ed60: 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e  file-mapping han
ed70: 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69  dle */.      voi
ed80: 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20  d *pMap = 0;    
ed90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
eda0: 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
edb0: 20 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20   */.     .      
edc0: 68 4d 61 70 20 3d 20 43 72 65 61 74 65 46 69 6c  hMap = CreateFil
edd0: 65 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64  eMapping(pShmNod
ede0: 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
edf0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
ee00: 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
ee10: 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
ee20: 20 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41    );.      OSTRA
ee30: 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64  CE(("SHM-MAP pid
ee40: 2d 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f  -%d create regio
ee50: 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73  n=%d nbyte=%d %s
ee60: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
ee70: 20 20 20 20 28 69 6e 74 29 47 65 74 43 75 72 72      (int)GetCurr
ee80: 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
ee90: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
eea0: 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  n, nByte,.      
eeb0: 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20           hMap ? 
eec0: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
eed0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
eee0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
eef0: 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e   iOffset = pShmN
ef00: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
ef10: 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  egion;.        i
ef20: 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
ef30: 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
ef40: 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
ef50: 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
ef60: 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 4d          pMap = M
ef70: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
ef80: 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
ef90: 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
efa0: 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
efb0: 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
efc0: 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
efd0: 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
efe0: 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  t.        );.   
eff0: 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
f000: 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d 61  HM-MAP pid-%d ma
f010: 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66 73  p region=%d offs
f020: 65 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25 73  et=%d size=%d %s
f030: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f040: 20 20 20 20 20 20 28 69 6e 74 29 47 65 74 43 75        (int)GetCu
f050: 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
f060: 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
f070: 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 20 73 7a  ion, iOffset, sz
f080: 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Region,.        
f090: 20 20 20 20 20 20 20 20 20 70 4d 61 70 20 3f 20           pMap ? 
f0a0: 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
f0b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f0c0: 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
f0d0: 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
f0e0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
f0f0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
f100: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
f110: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
f120: 52 5f 53 48 4d 4d 41 50 2c 20 22 77 69 6e 53 68  R_SHMMAP, "winSh
f130: 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
f140: 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
f150: 66 28 20 68 4d 61 70 20 29 20 43 6c 6f 73 65 48  f( hMap ) CloseH
f160: 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20  andle(hMap);.   
f170: 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
f180: 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
f190: 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
f1a0: 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
f1b0: 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20  ->nRegion].pMap 
f1c0: 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = pMap;.      pS
f1d0: 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
f1e0: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
f1f0: 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a  n].hMap = hMap;.
f200: 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
f210: 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d  nRegion++;.    }
f220: 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75  .  }..shmpage_ou
f230: 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  t:.  if( pShmNod
f240: 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69  e->nRegion>iRegi
f250: 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  on ){.    int iO
f260: 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a  ffset = iRegion*
f270: 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e  szRegion;.    in
f280: 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
f290: 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
f2a0: 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
f2b0: 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
f2c0: 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68     char *p = (ch
f2d0: 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61  ar *)pShmNode->a
f2e0: 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e  Region[iRegion].
f2f0: 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20  pMap;.    *pp = 
f300: 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73  (void *)&p[iOffs
f310: 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73  etShift];.  }els
f320: 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a  e{.    *pp = 0;.
f330: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
f340: 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
f350: 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
f360: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
f370: 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  e.# define winSh
f380: 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
f390: 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20  ine winShmLock  
f3a0: 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
f3b0: 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64  ShmBarrier 0.# d
f3c0: 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61  efine winShmUnma
f3d0: 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
f3e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f3f0: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
f400: 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
f410: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
f420: 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
f430: 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
f440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f450: 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
f460: 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
f470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
f490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
f4e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f  /*.** This vecto
f4f0: 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  r defines all th
f500: 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63  e methods that c
f510: 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e  an operate on an
f520: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
f530: 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73   for win32..*/.s
f540: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
f550: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
f560: 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  inIoMethod = {. 
f570: 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   2,             
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
f5a0: 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20    winClose,     
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
f5d0: 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20   winRead,       
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77   /* xRead */.  w
f600: 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  inWrite,        
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f620: 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69  * xWrite */.  wi
f630: 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f650: 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20   xTruncate */.  
f660: 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20  winSync,        
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69  /* xSync */.  wi
f690: 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  nFileSize,      
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f6b0: 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20   xFileSize */.  
f6c0: 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  winLock,        
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  /* xLock */.  wi
f6f0: 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nUnlock,        
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f710: 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69   xUnlock */.  wi
f720: 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
f730: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ck,           /*
f740: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
f750: 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ock */.  winFile
f760: 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20  Control,        
f770: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
f780: 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69  eControl */.  wi
f790: 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  nSectorSize,    
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f7b0: 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
f7c0: 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61    winDeviceChara
f7d0: 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20  cteristics,     
f7e0: 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72    /* xDeviceChar
f7f0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
f800: 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20   winShmMap,     
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20   /* xShmMap */. 
f830: 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20   winShmLock,    
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
f860: 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c    winShmBarrier,
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
f890: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61   */.  winShmUnma
f8a0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
f8b0: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d        /* xShmUnm
f8c0: 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a  ap */.};../*****
f8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f910: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
f920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f930: 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
f940: 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
f950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f960: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
f970: 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
f980: 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
f990: 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
f9a0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
f9b0: 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
f9c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
f9d0: 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
f9e0: 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
f9f0: 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
fa00: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
fa10: 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
fa20: 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
fa30: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
fa40: 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
fa50: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
fa60: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
fa70: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
fa80: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
fa90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63  /.static void *c
faa0: 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
fab0: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
fac0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
fad0: 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
fae0: 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  0;.  if( isNT() 
faf0: 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  ){.    zConverte
fb00: 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  d = utf8ToUnicod
fb10: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a  e(zFilename);./*
fb20: 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
fb30: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
fb40: 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
fb50: 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
fb60: 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
fb70: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
fb80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e   }else{.    zCon
fb90: 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
fba0: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
fbb0: 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
fbc0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20  #endif.  }.  /* 
fbd0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
fbe0: 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
fbf0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
fc00: 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
fc10: 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
fc20: 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
fc30: 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
fc40: 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
fc50: 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
fc60: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
fc70: 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
fc80: 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
fc90: 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
fca0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
fcb0: 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
fcc0: 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
fcd0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
fce0: 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
fcf0: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
fd00: 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
fd10: 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
fd20: 5f 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  _t i, j;.  char 
fd30: 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41  zTempPath[MAX_PA
fd40: 54 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27  TH+1];..  /* It'
fd50: 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
fd60: 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
fd70: 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
fd80: 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
fd90: 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
fda0: 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
fdb0: 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
fdc0: 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
fdd0: 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
fde0: 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
fdf0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
fe00: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
fe10: 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 69 66  E_IOERR );..  if
fe20: 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
fe30: 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
fe40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
fe50: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
fe60: 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73  empPath, "%s", s
fe70: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
fe80: 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20  ctory);.  }else 
fe90: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
fea0: 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
feb0: 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50      WCHAR zWideP
fec0: 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20  ath[MAX_PATH];. 
fed0: 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28     GetTempPathW(
fee0: 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69  MAX_PATH-30, zWi
fef0: 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75  dePath);.    zMu
ff00: 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  lti = unicodeToU
ff10: 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  tf8(zWidePath);.
ff20: 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29      if( zMulti )
ff30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ff40: 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
ff50: 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
ff60: 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a   "%s", zMulti);.
ff70: 20 20 20 20 20 20 66 72 65 65 28 7a 4d 75 6c 74        free(zMult
ff80: 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
ff90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ffa0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
ffb0: 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
ffc0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
ffd0: 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
ffe0: 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
fff0: 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
10000 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
10010 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
10020 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
10030 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
10040 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
10050 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
10060 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
10070 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
10080 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
10090 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
100a0 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
100b0 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b   char zMbcsPath[
100c0 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47  MAX_PATH];.    G
100d0 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f  etTempPathA(MAX_
100e0 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61  PATH-30, zMbcsPa
100f0 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d  th);.    zUtf8 =
10100 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
10110 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63  bcs_to_utf8(zMbc
10120 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  sPath);.    if( 
10130 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
10140 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10150 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
10160 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55  mpPath, "%s", zU
10170 74 66 38 29 3b 0a 20 20 20 20 20 20 66 72 65 65  tf8);.      free
10180 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c  (zUtf8);.    }el
10190 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
101a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
101b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
101c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
101d0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
101e0 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
101f0 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
10200 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
10210 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
10220 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
10230 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
10240 69 66 28 20 28 73 71 6c 69 74 65 33 53 74 72 6c  if( (sqlite3Strl
10250 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 20  en30(zTempPath) 
10260 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
10270 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  0(SQLITE_TEMP_FI
10280 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29  LE_PREFIX) + 17)
10290 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20   >= nBuf ){.    
102a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
102b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ROR;.  }..  for(
102c0 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  i=sqlite3Strlen3
102d0 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e  0(zTempPath); i>
102e0 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69  0 && zTempPath[i
102f0 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b  -1]=='\\'; i--){
10300 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d  }.  zTempPath[i]
10310 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
10320 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
10330 37 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  7, zBuf,.       
10340 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c              "%s\
10350 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  \"SQLITE_TEMP_FI
10360 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70  LE_PREFIX, zTemp
10370 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c  Path);.  j = sql
10380 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
10390 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  f);.  sqlite3_ra
103a0 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
103b0 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  uf[j]);.  for(i=
103c0 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
103d0 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20  +){.    zBuf[j] 
103e0 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20  = (char)zChars[ 
103f0 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
10400 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66  zBuf[j])%(sizeof
10410 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
10420 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30   }.  zBuf[j] = 0
10430 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
10440 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73  EMP FILENAME: %s
10450 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
10460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10470 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20   .}../*.** Open 
10480 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
10490 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
104a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
104b0 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  fs,        /* No
104c0 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
104d0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
104e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
104f0 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
10500 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
10510 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
10520 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
10530 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
10540 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
10550 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
10560 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
10570 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
10580 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
10590 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
105a0 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
105b0 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
105c0 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
105d0 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
105e0 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
105f0 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
10600 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
10610 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
10620 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
10630 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
10640 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
10650 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
10660 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
10670 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
10680 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
106a0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
106b0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
106c0 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
106d0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
106e0 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
106f0 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  8 encoding */.. 
10700 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
10710 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
10720 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
10730 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
10740 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
10750 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10760 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
10770 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
10780 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
10790 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
107a0 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 20  e[MAX_PATH+1];  
107b0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
107c0 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70  d to create temp
107d0 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20   filename */..  
107e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
107f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
10800 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
10810 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
10820 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
10830 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
10840 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
10850 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
10860 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
10870 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
10880 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
10890 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
108a0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
108b0 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
108c0 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
108d0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
108e0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
108f0 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
10900 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
10910 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
10920 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65 66  CREATE);.#ifndef
10930 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
10940 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
10950 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
10960 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e  N_READONLY);.#en
10970 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61 64  dif.  int isRead
10980 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
10990 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
109a0 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
109b0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
109c0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
109d0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
109e0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
109f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
10a00 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
10a10 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
10a20 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
10a30 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
10a40 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
10a50 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
10a60 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
10a70 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
10a80 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
10a90 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
10aa0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
10ab0 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
10ac0 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
10ad0 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
10ae0 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
10af0 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
10b00 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
10b10 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
10b20 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
10b30 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
10b40 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
10b50 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
10b60 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
10b70 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
10b80 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
10b90 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
10ba0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
10bb0 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
10bc0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
10bd0 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
10be0 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
10bf0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
10c00 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
10c10 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
10c20 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
10c30 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
10c40 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
10c50 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
10c60 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
10c70 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
10c80 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
10c90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ca0 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
10cb0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
10cc0 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
10cd0 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
10ce0 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
10cf0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
10d00 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
10d10 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
10d20 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
10d30 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
10d40 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
10d50 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
10d60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
10d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
10d80 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
10d90 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
10da0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
10db0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
10dc0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
10dd0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
10de0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
10df0 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
10e00 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
10e10 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
10e20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
10e30 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
10e40 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
10e50 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
10e60 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
10e70 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
10e80 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
10e90 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
10ea0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
10eb0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
10ec0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
10ed0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
10ee0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
10ef0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
10f00 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
10f10 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
10f20 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
10f30 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
10f40 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
10f50 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
10f60 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
10f70 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
10f80 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
10f90 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
10fa0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
10fb0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
10fc0 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  E;..  /* If the 
10fd0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
10fe0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
10ff0 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61   is NULL, genera
11000 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  te a .  ** tempo
11010 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
11020 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66  o use .  */.  if
11030 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a  ( !zUtf8Name ){.
11040 20 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c      assert(isDel
11050 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
11060 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d  urnal);.    rc =
11070 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58   getTempname(MAX
11080 5f 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e 61 6d  _PATH+1, zTmpnam
11090 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
110a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
110b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
110c0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
110d0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
110e0 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
110f0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20  the filename to 
11100 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64  the system encod
11110 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65  ing. */.  zConve
11120 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
11130 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
11140 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
11150 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
11160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11170 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
11180 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
11190 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
111a0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
111b0 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52  EAD | GENERIC_WR
111c0 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ITE;.  }else{.  
111d0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
111e0 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
111f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49  ;.  }..  /* SQLI
11200 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
11210 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  E is used to mak
11220 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65  e sure that a ne
11230 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  w file is .  ** 
11240 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20  created. SQLite 
11250 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74  doesn't use it t
11260 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c  o indicate "excl
11270 75 73 69 76 65 20 61 63 63 65 73 73 22 20 0a 20  usive access" . 
11280 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75   ** as it is usu
11290 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e  ally understood.
112a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78  .  */.  if( isEx
112b0 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f  clusive ){.    /
112c0 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20  * Creates a new 
112d0 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
112e0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
112f0 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20  y exist. */.    
11300 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65  /* If the file e
11310 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e  xists, it fails.
11320 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
11330 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
11340 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65  CREATE_NEW;.  }e
11350 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65  lse if( isCreate
11360 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   ){.    /* Open 
11370 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f  existing file, o
11380 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64  r create if it d
11390 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a  oesn't exist */.
113a0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
113b0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
113c0 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65  _ALWAYS;.  }else
113d0 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61  {.    /* Opens a
113e0 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
113f0 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20  t exists. */.   
11400 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
11410 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58  sition = OPEN_EX
11420 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64  ISTING;.  }..  d
11430 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c  wShareMode = FIL
11440 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46  E_SHARE_READ | F
11450 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b  ILE_SHARE_WRITE;
11460 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65  ..  if( isDelete
11470 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
11480 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c  S_WINCE.    dwFl
11490 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
114a0 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
114b0 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73  E_HIDDEN;.    is
114c0 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a  Temp = 1;.#else.
114d0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
114e0 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f  tributes = FILE_
114f0 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52  ATTRIBUTE_TEMPOR
11500 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ARY.            
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42     | FILE_ATTRIB
11530 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20  UTE_HIDDEN.     
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
11560 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f  _FLAG_DELETE_ON_
11570 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20  CLOSE;.#endif.  
11580 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61  }else{.    dwFla
11590 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
115a0 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
115b0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
115c0 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74  * Reports from t
115d0 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20  he internet are 
115e0 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  that performance
115f0 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20   is always.  ** 
11600 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46  better if FILE_F
11610 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
11620 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b  S is used.  Tick
11630 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66  et #2699. */.#if
11640 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11650 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  .  dwFlagsAndAtt
11660 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f  ributes |= FILE_
11670 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
11680 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  SS;.#endif..  if
11690 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
116a0 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28  h = CreateFileW(
116b0 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
116c0 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73  ed,.       dwDes
116d0 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
116e0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
116f0 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
11700 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
11710 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
11720 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
11730 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e  ibutes,.       N
11740 55 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a 20 69 73  ULL.    );./* is
11750 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
11760 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
11770 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
11780 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
11790 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
117a0 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
117b0 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
117c0 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
117d0 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
117e0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
117f0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
11800 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
11810 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
11820 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
11830 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 43  }else{.    h = C
11840 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61 72  reateFileA((char
11850 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  *)zConverted,.  
11860 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
11870 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77 53  cess,.       dwS
11880 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
11890 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77   NULL,.       dw
118a0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
118b0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 6c  ion,.       dwFl
118c0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
118d0 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20  ,.       NULL.  
118e0 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a    );.#endif.  }.
118f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
11900 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73  N %d %s 0x%lx %s
11910 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
11920 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73   h, zName, dwDes
11930 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20  iredAccess, .   
11940 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c          h==INVAL
11950 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
11960 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
11970 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49  "));..  if( h==I
11980 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
11990 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LUE ){.    pFile
119a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
119b0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
119c0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
119d0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 22  LITE_CANTOPEN, "
119e0 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e  winOpen", zUtf8N
119f0 61 6d 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  ame);.    free(z
11a00 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
11a10 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
11a20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11a30 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e  winOpen(pVfs, zN
11a40 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20  ame, id, .      
11a50 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
11a60 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11a70 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50  NLY)&~(SQLITE_OP
11a80 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45  EN_CREATE|SQLITE
11a90 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
11aa0 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20  ), pOutFlags);. 
11ab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
11ad0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
11ae0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
11af0 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
11b00 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
11b10 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
11b20 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
11b30 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
11b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
11b50 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
11b60 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
11b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d      }.  }..  mem
11b80 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
11b90 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20  zeof(*pFile));. 
11ba0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
11bb0 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
11bc0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
11bd0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11be0 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
11bf0 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70   pFile->pVfs = p
11c00 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53  Vfs;.  pFile->pS
11c10 68 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  hm = 0;.  pFile-
11c20 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
11c30 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
11c40 69 7a 65 20 3d 20 67 65 74 53 65 63 74 6f 72 53  ize = getSectorS
11c50 69 7a 65 28 70 56 66 73 2c 20 7a 55 74 66 38 4e  ize(pVfs, zUtf8N
11c60 61 6d 65 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ame);..#if SQLIT
11c70 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28  E_OS_WINCE.  if(
11c80 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
11c90 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
11ca0 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
11cb0 20 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74    && !winceCreat
11cc0 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
11cd0 6c 65 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f  le).  ){.    Clo
11ce0 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20  seHandle(h);.   
11cf0 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64   free(zConverted
11d00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11d10 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
11d20 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  PT;.  }.  if( is
11d30 54 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c  Temp ){.    pFil
11d40 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
11d50 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  e = zConverted;.
11d60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
11d70 20 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e   {.    free(zCon
11d80 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20  verted);.  }..  
11d90 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
11da0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11db0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
11dc0 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
11dd0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69  .** Note that wi
11de0 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
11df0 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
11e00 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
11e10 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
11e20 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
11e30 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
11e40 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
11e50 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
11e60 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
11e70 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
11e80 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
11e90 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
11ea0 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
11eb0 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
11ec0 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
11ed0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
11ee0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
11ef0 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
11f00 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
11f10 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
11f20 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
11f30 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
11f40 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
11f50 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
11f60 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
11f70 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
11f80 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
11f90 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
11fa0 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
11fb0 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
11fc0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
11fd0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
11fe0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
11ff0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
12000 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
12010 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
12020 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12030 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
12040 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
12050 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  e */.  int syncD
12060 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ir              
12070 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
12080 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20  n win32 */.){.  
12090 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
120a0 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a 7a  nt rc;.  void *z
120b0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
120c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
120d0 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
120e0 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
120f0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
12100 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
12110 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
12120 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
12130 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
12140 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
12150 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
12160 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
12170 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12180 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
12190 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) ){.    while( 
121a0 28 72 63 20 3d 20 44 65 6c 65 74 65 46 69 6c 65  (rc = DeleteFile
121b0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 21 3d  W(zConverted))!=
121c0 30 20 7c 7c 20 72 65 74 72 79 49 6f 65 72 72 28  0 || retryIoerr(
121d0 26 63 6e 74 29 20 29 7b 7d 0a 2f 2a 20 69 73 4e  &cnt) ){}./* isN
121e0 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
121f0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
12200 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
12210 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
12220 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53  .** Since the AS
12230 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  CII version of t
12240 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
12250 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
12260 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
12270 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
12280 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
12290 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
122a0 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
122b0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
122c0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
122d0 20 28 72 63 20 3d 20 44 65 6c 65 74 65 46 69 6c   (rc = DeleteFil
122e0 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 21  eW(zConverted))!
122f0 3d 30 20 7c 7c 20 72 65 74 72 79 49 6f 65 72 72  =0 || retryIoerr
12300 28 26 63 6e 74 29 20 29 7b 7d 0a 23 65 6e 64 69  (&cnt) ){}.#endi
12310 66 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  f.  }.  if( rc )
12320 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
12330 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
12340 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 77 69 6e  ERR_DELETE, "win
12350 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61  Delete", zFilena
12360 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
12370 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
12380 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
12390 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41  verted);.  OSTRA
123a0 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73  CE(("DELETE \"%s
123b0 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  \" %s\n", zFilen
123c0 61 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c  ame, (rc ? "fail
123d0 65 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a  ed" : "ok" )));.
123e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
123f0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20  /*.** Check the 
12400 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74  existance and st
12410 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a  atus of a file..
12420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12430 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  nAccess(.  sqlit
12440 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
12450 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
12460 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
12470 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
12480 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61  ename,     /* Na
12490 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68  me of file to ch
124a0 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  eck */.  int fla
124b0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
124c0 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
124d0 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74  est to make on t
124e0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
124f0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
12500 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
12510 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20   Result */.){.  
12520 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
12530 74 20 72 63 20 3d 20 30 3b 0a 20 20 76 6f 69 64  t rc = 0;.  void
12540 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
12550 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12560 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c  (pVfs);..  Simul
12570 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12580 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12590 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f  ACCESS; );.  zCo
125a0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
125b0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
125c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
125d0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
125e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
125f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
12600 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
12610 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
12620 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
12630 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
12640 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
12650 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
12660 61 29 29 3b 0a 20 20 20 20 69 66 28 20 47 65 74  a));.    if( Get
12670 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
12680 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
12690 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
126c0 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20  Standard, .     
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
126f0 74 61 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ta) ){.      /* 
12700 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
12710 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
12720 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
12730 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
12740 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
12750 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
12760 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
12770 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
12780 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
12790 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
127a0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
127b0 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20  High==0 .       
127c0 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
127d0 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
127e0 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
127f0 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
12800 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
12810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12820 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
12830 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
12840 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
12850 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
12860 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
12870 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
12880 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
12890 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
128a0 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
128b0 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46   "winAccess", zF
128c0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
128d0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
128e0 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  d);.        retu
128f0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12900 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65  ACCESS;.      }e
12910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
12920 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
12930 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
12940 20 20 20 7d 0a 20 20 20 20 7d 0a 2f 2a 20 69 73     }.    }./* is
12950 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
12960 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
12970 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
12980 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
12990 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
129a0 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
129b0 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
129c0 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
129d0 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
129e0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
129f0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
12a00 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
12a10 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
12a20 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
12a30 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20  }else{.    attr 
12a40 3d 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  = GetFileAttribu
12a50 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  tesA((char*)zCon
12a60 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
12a70 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76    }.  free(zConv
12a80 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
12a90 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
12aa0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
12ab0 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
12ac0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
12ad0 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
12ae0 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
12af0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
12b00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12b10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
12b20 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
12b30 20 20 20 20 20 20 72 63 20 3d 20 28 61 74 74 72        rc = (attr
12b40 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
12b50 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
12b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12b70 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
12b80 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
12b90 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
12ba0 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
12bb0 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
12bc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
12bd0 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
12be0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
12bf0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
12c00 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ame.  Write the 
12c10 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65  full.** pathname
12c20 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a   into zOut[].  z
12c30 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74  Out[] will be at
12c40 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50   least pVfs->mxP
12c50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73  athname.** bytes
12c60 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
12c70 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50  tic int winFullP
12c80 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
12c90 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
12ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12cb0 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
12cc0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
12cd0 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20  r *zRelative,   
12ce0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
12cf0 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
12d00 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
12d10 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
12d20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12d30 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
12d40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
12d50 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20  har *zFull      
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12d70 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
12d80 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e  .){.  .#if defin
12d90 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
12da0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12db0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12dc0 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45  ERROR );.  UNUSE
12dd0 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c  D_PARAMETER(nFul
12de0 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63 6f 6e  l);.  cygwin_con
12df0 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f  v_to_full_win32_
12e00 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20  path(zRelative, 
12e10 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  zFull);.  return
12e20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
12e30 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
12e40 53 5f 57 49 4e 43 45 0a 20 20 53 69 6d 75 6c 61  S_WINCE.  Simula
12e50 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
12e60 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
12e70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12e80 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 2f  ETER(nFull);.  /
12e90 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63  * WinCE has no c
12ea0 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61  oncept of a rela
12eb0 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f  tive pathname, o
12ec0 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20  r so I am told. 
12ed0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  */.  sqlite3_snp
12ee0 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61  rintf(pVfs->mxPa
12ef0 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22  thname, zFull, "
12f00 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
12f10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12f20 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
12f30 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
12f40 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  E && !defined(__
12f50 43 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20  CYGWIN__).  int 
12f60 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
12f70 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
12f80 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  r *zOut;..  /* I
12f90 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65  f this path name
12fa0 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58   begins with "/X
12fb0 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73  :", where "X" is
12fc0 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a   any alphabetic.
12fd0 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
12fe0 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74  discard the init
12ff0 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65  ial "/" from the
13000 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   pathname..  */.
13010 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
13020 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74  0]=='/' && sqlit
13030 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74  e3Isalpha(zRelat
13040 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61  ive[1]) && zRela
13050 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a  tive[2]==':' ){.
13060 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
13070 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
13080 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
13090 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
130a0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
130b0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
130c0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
130d0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
130e0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
130f0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
13100 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
13110 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
13120 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
13130 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
13140 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
13150 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
13160 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
13170 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
13180 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
131a0 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
131b0 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
131c0 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
131d0 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
131e0 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
131f0 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
13200 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65  {.    WCHAR *zTe
13210 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
13220 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
13230 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
13240 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20  ted, 0, 0, 0) + 
13250 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d  3;.    zTemp = m
13260 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a  alloc( nByte*siz
13270 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
13280 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
13290 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
132a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
132b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
132c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
132d0 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d    GetFullPathNam
132e0 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76  eW((WCHAR*)zConv
132f0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
13300 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72 65  emp, 0);.    fre
13310 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
13320 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64     zOut = unicod
13330 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
13340 20 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b      free(zTemp);
13350 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
13360 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
13370 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
13380 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
13390 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
133a0 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
133b0 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
133c0 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
133d0 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
133e0 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
133f0 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
13400 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
13410 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
13420 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13430 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
13440 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
13450 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
13460 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
13470 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
13480 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20   0, 0) + 3;.    
13490 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20  zTemp = malloc( 
134a0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
134b0 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
134c0 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
134d0 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
134e0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
134f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13500 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75  .    }.    GetFu
13510 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
13520 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
13530 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
13540 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65  .    free(zConve
13550 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
13560 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
13570 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
13580 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54  mp);.    free(zT
13590 65 6d 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  emp);.#endif.  }
135a0 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
135b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
135c0 6e 74 66 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ntf(pVfs->mxPath
135d0 6e 61 6d 65 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  name, zFull, "%s
135e0 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 66 72  ", zOut);.    fr
135f0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
13600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
13620 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13630 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
13640 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 73 65  /*.** Get the se
13650 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65  ctor size of the
13660 20 64 65 76 69 63 65 20 75 73 65 64 20 74 6f 20   device used to 
13670 73 74 6f 72 65 0a 2a 2a 20 66 69 6c 65 2e 0a 2a  store.** file..*
13680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
13690 53 65 63 74 6f 72 53 69 7a 65 28 0a 20 20 20 20  SectorSize(.    
136a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
136b0 73 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  s,.    const cha
136c0 72 20 2a 7a 52 65 6c 61 74 69 76 65 20 20 20 20  r *zRelative    
136d0 20 2f 2a 20 55 54 46 2d 38 20 66 69 6c 65 20 6e   /* UTF-8 file n
136e0 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52  ame */.){.  DWOR
136f0 44 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72  D bytesPerSector
13700 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
13710 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
13720 20 2f 2a 20 47 65 74 44 69 73 6b 46 72 65 65 53   /* GetDiskFreeS
13730 70 61 63 65 20 69 73 20 6e 6f 74 20 73 75 70 70  pace is not supp
13740 6f 72 74 65 64 20 75 6e 64 65 72 20 57 49 4e 43  orted under WINC
13750 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
13760 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55 53 45  OS_WINCE.  UNUSE
13770 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
13780 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
13790 4d 45 54 45 52 28 7a 52 65 6c 61 74 69 76 65 29  METER(zRelative)
137a0 3b 0a 23 65 6c 73 65 0a 20 20 63 68 61 72 20 7a  ;.#else.  char z
137b0 46 75 6c 6c 70 61 74 68 5b 4d 41 58 5f 50 41 54  Fullpath[MAX_PAT
137c0 48 2b 31 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  H+1];.  int rc;.
137d0 20 20 44 57 4f 52 44 20 64 77 52 65 74 20 3d 20    DWORD dwRet = 
137e0 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 75 6d  0;.  DWORD dwDum
137f0 6d 79 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 57  my;..  /*.  ** W
13800 65 20 6e 65 65 64 20 74 6f 20 67 65 74 20 74 68  e need to get th
13810 65 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  e full path name
13820 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   of the file.  *
13830 2a 20 74 6f 20 67 65 74 20 74 68 65 20 64 72 69  * to get the dri
13840 76 65 20 6c 65 74 74 65 72 20 74 6f 20 6c 6f 6f  ve letter to loo
13850 6b 20 75 70 20 74 68 65 20 73 65 63 74 6f 72 0a  k up the sector.
13860 20 20 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a    ** size..  */.
13870 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
13880 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 72 63  rBenign(1);.  rc
13890 20 3d 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61   = winFullPathna
138a0 6d 65 28 70 56 66 73 2c 20 7a 52 65 6c 61 74 69  me(pVfs, zRelati
138b0 76 65 2c 20 4d 41 58 5f 50 41 54 48 2c 20 7a 46  ve, MAX_PATH, zF
138c0 75 6c 6c 70 61 74 68 29 3b 0a 20 20 53 69 6d 75  ullpath);.  Simu
138d0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
138e0 6e 28 30 29 3b 0a 20 20 69 66 28 20 72 63 20 3d  n(0);.  if( rc =
138f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20 20  = SQLITE_OK ).  
13900 7b 0a 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  {.    void *zCon
13910 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
13920 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75  Utf8Filename(zFu
13930 6c 6c 70 61 74 68 29 3b 0a 20 20 20 20 69 66 28  llpath);.    if(
13940 20 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20   zConverted ){. 
13950 20 20 20 20 20 69 66 28 20 69 73 4e 54 28 29 20       if( isNT() 
13960 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 72  ){.        /* tr
13970 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74 20  im path to just 
13980 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  drive reference 
13990 2a 2f 0a 20 20 20 20 20 20 20 20 57 43 48 41 52  */.        WCHAR
139a0 20 2a 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64   *p = zConverted
139b0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 2a  ;.        for(;*
139c0 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  p;p++){.        
139d0 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27    if( *p == '\\'
139e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
139f0 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  *p = '\0';.     
13a00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13a20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52 65    }.        dwRe
13a30 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65 53  t = GetDiskFreeS
13a40 70 61 63 65 57 28 28 57 43 48 41 52 2a 29 7a 43  paceW((WCHAR*)zC
13a50 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
13a80 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ummy,.          
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 20 20 20 20 20 20 26 62 79 74 65 73 50 65          &bytesPe
13ab0 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20 20  rSector,.       
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ad0 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75             &dwDu
13ae0 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mmy,.           
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 29         &dwDummy)
13b10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13b20 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70         /* trim p
13b30 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76  ath to just driv
13b40 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20  e reference */. 
13b50 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 20 3d         char *p =
13b60 20 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65 72   (char *)zConver
13b70 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ted;.        for
13b80 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20  (;*p;p++){.     
13b90 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27       if( *p == '
13ba0 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
13bb0 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20     *p = '\0';.  
13bc0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
13bd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
13bf0 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b 46 72  wRet = GetDiskFr
13c00 65 65 53 70 61 63 65 41 28 28 63 68 61 72 2a 29  eeSpaceA((char*)
13c10 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
13c40 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20  wDummy,.        
13c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c60 20 20 20 20 20 20 20 20 20 20 26 62 79 74 65 73            &bytes
13c70 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20  PerSector,.     
13c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c90 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77               &dw
13ca0 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20  Dummy,.         
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d           &dwDumm
13cd0 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
13ce0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
13cf0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
13d00 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20 20 20  ( !dwRet ){.    
13d10 20 20 62 79 74 65 73 50 65 72 53 65 63 74 6f 72    bytesPerSector
13d20 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
13d30 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
13d40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13d50 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 62    return (int) b
13d60 79 74 65 73 50 65 72 53 65 63 74 6f 72 3b 20 0a  ytesPerSector; .
13d70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13d80 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
13d90 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
13da0 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
13db0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
13dc0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
13dd0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
13de0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
13df0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
13e00 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
13e10 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  ibrary..*/./*.**
13e20 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
13e30 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
13e40 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
13e50 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
13e60 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
13e70 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
13e80 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
13e90 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
13ea0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
13eb0 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
13ec0 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
13ed0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
13ee0 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
13ef0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
13f00 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
13f10 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
13f20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
13f30 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
13f40 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
13f50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
13f60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
13f70 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c 6f  () ){.    h = Lo
13f80 61 64 4c 69 62 72 61 72 79 57 28 28 57 43 48 41  adLibraryW((WCHA
13f90 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  R*)zConverted);.
13fa0 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
13fb0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13fc0 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
13fd0 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
13fe0 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
13ff0 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
14000 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
14010 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
14020 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
14030 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
14040 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
14050 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
14060 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
14070 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
14080 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
14090 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 41  h = LoadLibraryA
140a0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
140b0 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
140c0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
140d0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  d);.  return (vo
140e0 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20  id*)h;.}.static 
140f0 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28  void winDlError(
14100 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
14110 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
14120 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55  r *zBufOut){.  U
14130 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14140 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73 74  pVfs);.  getLast
14150 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20 7a  ErrorMsg(nBuf, z
14160 42 75 66 4f 75 74 29 3b 0a 7d 0a 76 6f 69 64 20  BufOut);.}.void 
14170 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
14180 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
14190 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
141a0 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
141b0 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53  ))(void){.  UNUS
141c0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
141d0 73 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s);.#if SQLITE_O
141e0 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65  S_WINCE.  /* The
141f0 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41   GetProcAddressA
14200 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  () routine is on
14210 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
14220 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74 75  wince. */.  retu
14230 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64  rn (void(*)(void
14240 29 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ))GetProcAddress
14250 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  A((HANDLE)pHandl
14260 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6c  e, zSymbol);.#el
14270 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65  se.  /* All othe
14280 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f  r windows platfo
14290 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50 72  rms expect GetPr
142a0 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20 74  ocAddress() to t
142b0 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73 69  ake.  ** an Ansi
142c0 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65   string regardle
142d0 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f  ss of the _UNICO
142e0 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  DE setting */.  
142f0 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
14300 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64 64  void))GetProcAdd
14310 72 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48 61  ress((HANDLE)pHa
14320 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a  ndle, zSymbol);.
14330 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77 69  #endif.}.void wi
14340 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nDlClose(sqlite3
14350 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
14360 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
14370 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
14380 56 66 73 29 3b 0a 20 20 46 72 65 65 4c 69 62 72  Vfs);.  FreeLibr
14390 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
143a0 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
143b0 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
143c0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
143d0 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
143e0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
143f0 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
14400 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
14410 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
14420 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
14430 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
14440 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
14450 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
14460 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
14470 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
14480 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
14490 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
144a0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
144b0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
144c0 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
144d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
144e0 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
144f0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
14500 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
14510 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
14520 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
14530 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
14540 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
14550 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
14560 20 20 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d      GetSystemTim
14570 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70  e(&x);.    memcp
14580 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20  y(&zBuf[n], &x, 
14590 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
145a0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a  n += sizeof(x);.
145b0 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
145c0 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
145d0 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64  ){.    DWORD pid
145e0 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
145f0 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65  cessId();.    me
14600 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
14610 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
14620 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
14630 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20 69  of(pid);.  }.  i
14640 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
14650 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
14660 44 57 4f 52 44 20 63 6e 74 20 3d 20 47 65 74 54  DWORD cnt = GetT
14670 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
14680 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
14690 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
146a0 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
146b0 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 20  zeof(cnt);.  }. 
146c0 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
146d0 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
146e0 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
146f0 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 51  INTEGER i;.    Q
14700 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
14710 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20  ounter(&i);.    
14720 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
14730 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b   &i, sizeof(i));
14740 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
14750 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (i);.  }.#endif.
14760 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
14770 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
14780 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
14790 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
147a0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
147b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
147c0 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
147d0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
147e0 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c 65  microsec){.  Sle
147f0 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
14800 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
14810 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
14820 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
14830 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
14840 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
14850 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
14860 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
14870 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
14880 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
14890 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
148a0 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
148b0 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
148c0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
148d0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
148e0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
148f0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
14900 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
14910 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
14920 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
14930 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
14940 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
14950 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
14960 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
14970 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
14980 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
14990 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
149a0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
149b0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
149c0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
149d0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
149e0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
149f0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
14a00 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
14a10 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
14a20 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
14a30 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
14a40 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
14a50 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
14a60 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
14a70 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
14a80 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
14a90 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
14aa0 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
14ab0 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
14ac0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
14ad0 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ss, return 0.  R
14ae0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
14af0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
14b00 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
14b10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
14b20 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
14b30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
14b40 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
14b50 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46   *piNow){.  /* F
14b60 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
14b70 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
14b80 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
14b90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a   the number of .
14ba0 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
14bb0 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
14bc0 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
14bd0 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
14be0 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49  3.5). .  */.  FI
14bf0 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61  LETIME ft;.  sta
14c00 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
14c10 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74  3_int64 winFilet
14c20 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38  imeEpoch = 23058
14c30 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  135*(sqlite3_int
14c40 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64  64)8640000;.#ifd
14c50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
14c60 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
14c70 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
14c80 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
14c90 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
14ca0 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  8640000;.#endif.
14cb0 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61    /* 2^32 - to a
14cc0 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61  void use of LL a
14cd0 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67  nd warnings in g
14ce0 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  cc */.  static c
14cf0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
14d00 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65  64 max32BitValue
14d10 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74   = .      (sqlit
14d20 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
14d30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69  000 + (sqlite3_i
14d40 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
14d50 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
14d60 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
14d70 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
14d80 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
14d90 6d 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d 54  me;.  GetSystemT
14da0 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a  ime(&time);.  /*
14db0 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f   if SystemTimeTo
14dc0 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73  FileTime() fails
14dd0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  , it returns zer
14de0 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 53 79 73  o. */.  if (!Sys
14df0 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
14e00 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
14e10 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
14e20 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73 74  .#else.  GetSyst
14e30 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
14e40 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
14e50 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
14e60 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
14e70 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
14e80 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
14e90 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
14ea0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
14eb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14ec0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
14ed0 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
14ee0 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
14ef0 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
14f00 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
14f10 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
14f20 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
14f30 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
14f40 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
14f50 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
14f60 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
14f70 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
14f80 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
14f90 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
14fa0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
14fb0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
14fc0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
14fd0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
14fe0 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
14ff0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
15000 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
15010 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
15020 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
15030 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
15040 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
15050 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
15060 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e  ound..*/.int win
15070 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
15080 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
15090 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
150a0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
150b0 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63  e3_int64 i;.  rc
150c0 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d   = winCurrentTim
150d0 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29  eInt64(pVfs, &i)
150e0 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20  ;.  if( !rc ){. 
150f0 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36     *prNow = i/86
15100 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20  400000.0;.  }.  
15110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15120 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20  .** The idea is 
15130 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
15140 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20  on works like a 
15150 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a  combination of.*
15160 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
15170 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61   and FormatMessa
15180 67 65 28 29 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ge() on windows 
15190 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a  (or errno and.**
151a0 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e   strerror_r() on
151b0 20 75 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e   unix). After an
151c0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
151d0 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66  ed by an OS.** f
151e0 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20  unction, SQLite 
151f0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
15200 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f  ion with zBuf po
15210 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62  inting to.** a b
15220 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79  uffer of nBuf by
15230 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65  tes. The OS laye
15240 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74  r should populat
15250 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20  e the.** buffer 
15260 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69  with a nul-termi
15270 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f  nated UTF-8 enco
15280 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ded error messag
15290 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  e.** describing 
152a0 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f  the last IO erro
152b0 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72  r to have occurr
152c0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
152d0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e  lling.** thread.
152e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72  .**.** If the er
152f0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74  ror message is t
15300 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65  oo large for the
15310 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
15320 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62  ,.** it should b
15330 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  e truncated. The
15340 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
15350 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a   xGetLastError.*
15360 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
15370 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
15380 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
15390 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
153a0 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
153b0 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
153c0 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e  truncated). If n
153d0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
153e0 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ned,.** then it 
153f0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
15400 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
15410 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63  nul-terminator c
15420 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
15430 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
15440 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70  ..**.** Not supp
15450 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  lying an error m
15460 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65  essage will have
15470 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65   no adverse effe
15480 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e  ct.** on SQLite.
15490 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68   It is fine to h
154a0 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  ave an implement
154b0 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72  ation that never
154c0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
154d0 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a  rror message:.**
154e0 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61  .**   int xGetLa
154f0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
15500 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
15510 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
15520 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  {.**     assert(
15530 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a  zBuf[0]=='\0');.
15540 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  **     return 0;
15550 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f  .**   }.**.** Ho
15560 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f  wever if an erro
15570 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70  r message is sup
15580 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  plied, it will b
15590 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a  e incorporated.*
155a0 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f  * by sqlite into
155b0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
155c0 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ge available to 
155d0 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a  the user using.*
155e0 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  * sqlite3_errmsg
155f0 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b  (), possibly mak
15600 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61  ing IO errors ea
15610 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a  sier to debug..*
15620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15630 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
15640 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
15650 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
15660 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
15670 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
15680 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73  .  return getLas
15690 74 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20  tErrorMsg(nBuf, 
156a0 7a 42 75 66 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  zBuf);.}..../*.*
156b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
156c0 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
156d0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
156e0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
156f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
15700 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
15710 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
15720 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
15730 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
15740 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
15750 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
15760 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
15770 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
15780 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20  MAX_PATH,       
15790 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
157a0 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
157c0 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
157d0 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
157e0 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
157f0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
15800 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
15810 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
15820 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
15830 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
15840 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
15850 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
15860 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
15870 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
15880 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
15890 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
158a0 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
158b0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
158c0 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
158d0 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
158e0 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
158f0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
15900 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
15910 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
15920 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
15930 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
15940 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
15950 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
15960 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
15970 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
15980 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
15990 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
159a0 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
159b0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
159c0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
159d0 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
159e0 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
159f0 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
15a00 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
15a10 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
15a20 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
15a30 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
15a40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 74           /* xSet
15a50 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
15a60 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
15a70 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79         /* xGetSy
15a80 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
15a90 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
15aa0 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73       /* xNextSys
15ab0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
15ac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15ad0 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65  OMIT_WAL.  /* ge
15ae0 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
15af0 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
15b00 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
15b10 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
15b20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
15b30 46 4f 29 29 3b 0a 20 20 47 65 74 53 79 73 74 65  FO));.  GetSyste
15b40 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
15b50 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 77 69 6e  o);.  assert(win
15b60 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
15b70 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20  tionGranularity 
15b80 3e 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  > 0);.#endif..  
15b90 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
15ba0 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
15bb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15bc0 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c  E_OK; .}.int sql
15bd0 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64  ite3_os_end(void
15be0 29 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ){ .  return SQL
15bf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
15c00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
15c10 49 4e 20 2a 2f 0a                                IN */.