/ Hex Artifact Content
Login

Artifact f79cb7c31cc82532f625313d9f29359931dd2ed7:


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 73 74  LAY 25.#endif.st
3310: 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49 6f  atic int win32Io
3320: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
3330: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
3340: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
3350: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
3360: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
3370: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
3380: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66  DELAY;../*.** If
3390: 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72   a ReadFile() or
33a0: 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72   WriteFile() err
33b0: 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b  or occurs, invok
33c0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
33d0: 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73  * to see if it s
33e0: 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64  hould be retried
33f0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74  .  Return TRUE t
3400: 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e  o retry.  Return
3410: 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76   FALSE.** to giv
3420: 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72  e up with an err
3430: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
3440: 74 20 72 65 74 72 79 49 6f 65 72 72 28 69 6e 74  t retryIoerr(int
3450: 20 2a 70 6e 52 65 74 72 79 29 7b 0a 20 20 44 57   *pnRetry){.  DW
3460: 4f 52 44 20 65 3b 0a 20 20 69 66 28 20 2a 70 6e  ORD e;.  if( *pn
3470: 52 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72  Retry>=win32Ioer
3480: 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 72 65  rRetry ){.    re
3490: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 65 20  turn 0;.  }.  e 
34a0: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
34b0: 3b 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f 52  ;.  if( e==ERROR
34c0: 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 20 7c  _ACCESS_DENIED |
34d0: 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52  |.      e==ERROR
34e0: 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20  _LOCK_VIOLATION 
34f0: 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f  ||.      e==ERRO
3500: 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  R_SHARING_VIOLAT
3510: 49 4f 4e 20 29 7b 0a 20 20 20 20 53 6c 65 65 70  ION ){.    Sleep
3520: 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  (win32IoerrRetry
3530: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
3540: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
3550: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
3560: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3570: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
3580: 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
3590: 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
35a0: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65  atic void logIoe
35b0: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  rr(int nRetry){.
35c0: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
35d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
35e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20  SQLITE_IOERR, . 
35f0: 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
3600: 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
3610: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20  ing conflict",. 
3620: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
3630: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
3640: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20  *(nRetry+1)/2.  
3650: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20    );.  }.}..#if 
3660: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
3670: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
3680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
36c0: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
36d0: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
36e0: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  CE only..*/./*.*
36f0: 2a 20 57 69 6e 64 6f 77 73 43 45 20 64 6f 65 73  * WindowsCE does
3700: 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61   not have a loca
3710: 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  ltime() function
3720: 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a 2a  .  So create a.*
3730: 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f  * substitute..*/
3740: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
3750: 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f  h>.struct tm *__
3760: 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28  cdecl localtime(
3770: 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29  const time_t *t)
3780: 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  .{.  static stru
3790: 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54  ct tm y;.  FILET
37a0: 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20  IME uTm, lTm;.  
37b0: 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a  SYSTEMTIME pTm;.
37c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
37d0: 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b  t64;.  t64 = *t;
37e0: 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20  .  t64 = (t64 + 
37f0: 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30  11644473600)*100
3800: 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c  00000;.  uTm.dwL
3810: 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57  owDateTime = (DW
3820: 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46  ORD)(t64 & 0xFFF
3830: 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77  FFFFF);.  uTm.dw
3840: 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44  HighDateTime= (D
3850: 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29  WORD)(t64 >> 32)
3860: 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c 6f  ;.  FileTimeToLo
3870: 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d  calFileTime(&uTm
3880: 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54 69  ,&lTm);.  FileTi
3890: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
38a0: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
38b0: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
38c0: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
38d0: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
38e0: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
38f0: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
3900: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
3910: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
3920: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
3930: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
3940: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
3950: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
3960: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
3970: 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a 20 54 68  urn &y;.}../* Th
3980: 69 73 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  is will never be
3990: 20 63 61 6c 6c 65 64 2c 20 62 75 74 20 64 65 66   called, but def
39a0: 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  ined to make the
39b0: 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65 20 2a 2f   code compile */
39c0: 0a 23 64 65 66 69 6e 65 20 47 65 74 54 65 6d 70  .#define GetTemp
39d0: 50 61 74 68 41 28 61 2c 62 29 0a 0a 23 64 65 66  PathA(a,b)..#def
39e0: 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28 61 2c 62  ine LockFile(a,b
39f0: 2c 63 2c 64 2c 65 29 20 20 20 20 20 20 20 77 69  ,c,d,e)       wi
3a00: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 61 2c 20  nceLockFile(&a, 
3a10: 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64 65 66  b, c, d, e).#def
3a20: 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 61  ine UnlockFile(a
3a30: 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 77 69  ,b,c,d,e)     wi
3a40: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 61  nceUnlockFile(&a
3a50: 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23 64  , b, c, d, e).#d
3a60: 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 45 78  efine LockFileEx
3a70: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 20 20  (a,b,c,d,e,f)   
3a80: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28  winceLockFileEx(
3a90: 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 2c 20  &a, b, c, d, e, 
3aa0: 66 29 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44  f)..#define HAND
3ab0: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29  LE_TO_WINFILE(a)
3ac0: 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68   (winFile*)&((ch
3ad0: 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66  ar*)a)[-(int)off
3ae0: 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29  setof(winFile,h)
3af0: 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  ]../*.** Acquire
3b00: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68   a lock on the h
3b10: 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69  andle h.*/.stati
3b20: 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65  c void winceMute
3b30: 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20  xAcquire(HANDLE 
3b40: 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45  h){.   DWORD dwE
3b50: 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20  rr;.   do {.    
3b60: 20 64 77 45 72 72 20 3d 20 57 61 69 74 46 6f 72   dwErr = WaitFor
3b70: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
3b80: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
3b90: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
3ba0: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
3bb0: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
3bc0: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
3bd0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
3be0: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
3bf0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
3c00: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
3c10: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
3c20: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
3c30: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
3c40: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
3c50: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
3c60: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
3c70: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
3c80: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
3c90: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
3ca0: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
3cb0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
3cc0: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
3cd0: 65 29 7b 0a 20 20 57 43 48 41 52 20 2a 7a 54 6f  e){.  WCHAR *zTo
3ce0: 6b 3b 0a 20 20 57 43 48 41 52 20 2a 7a 4e 61 6d  k;.  WCHAR *zNam
3cf0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
3d00: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
3d10: 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
3d20: 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  E;..  /* Initial
3d30: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
3d40: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 5a 65 72 6f  ckdata */.  Zero
3d50: 4d 65 6d 6f 72 79 28 26 70 46 69 6c 65 2d 3e 6c  Memory(&pFile->l
3d60: 6f 63 61 6c 2c 20 73 69 7a 65 6f 66 28 70 46 69  ocal, sizeof(pFi
3d70: 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20  le->local));..  
3d80: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62  /* Replace the b
3d90: 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20  ackslashes from 
3da0: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
3db0: 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20   lowercase it.  
3dc0: 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d  ** to derive a m
3dd0: 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  utex name. */.  
3de0: 7a 54 6f 6b 20 3d 20 43 68 61 72 4c 6f 77 65 72  zTok = CharLower
3df0: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
3e00: 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
3e10: 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
3e20: 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
3e30: 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
3e40: 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
3e50: 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
3e60: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
3e70: 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c  CreateMutexW(NUL
3e80: 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29  L, FALSE, zName)
3e90: 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ;.  if (!pFile->
3ea0: 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69  hMutex){.    pFi
3eb0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
3ec0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
3ed0: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
3ee0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 77  SQLITE_ERROR, "w
3ef0: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
3f00: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
3f10: 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20    free(zName);. 
3f20: 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b     return FALSE;
3f30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
3f40: 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
3f50: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
3f60: 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
3f70: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
3f80: 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69  tex);.  .  /* Si
3f90: 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  nce the names of
3fa0: 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20   named mutexes, 
3fb0: 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65  semaphores, file
3fc0: 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72   mappings etc ar
3fd0: 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  e .  ** case-sen
3fe0: 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
3ff0: 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
4000: 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
4010: 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
4020: 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
4030: 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
4040: 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
4050: 0a 20 20 2a 2f 0a 20 20 43 68 61 72 55 70 70 65  .  */.  CharUppe
4060: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69  rW(zName);.  pFi
4070: 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 43 72  le->hShared = Cr
4080: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
4090: 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
40a0: 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
40e0: 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
40f0: 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4120: 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a   zName);  ..  /*
4130: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
4140: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
4150: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
4160: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
4170: 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74  so it .  ** must
4180: 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
4190: 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20 28 47 65  ized */.  if (Ge
41a0: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20  tLastError() == 
41b0: 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58  ERROR_ALREADY_EX
41c0: 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74  ISTS){.    bInit
41d0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20   = FALSE;.  }.. 
41e0: 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20   free(zName);.. 
41f0: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
4200: 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
4210: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
4220: 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
4230: 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  */.  if (pFile->
4240: 68 53 68 61 72 65 64 29 7b 0a 20 20 20 20 70 46  hShared){.    pF
4250: 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77  ile->shared = (w
4260: 69 6e 63 65 4c 6f 63 6b 2a 29 4d 61 70 56 69 65  inceLock*)MapVie
4270: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  wOfFile(pFile->h
4280: 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20  Shared, .       
4290: 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52        FILE_MAP_R
42a0: 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49  EAD|FILE_MAP_WRI
42b0: 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66  TE, 0, 0, sizeof
42c0: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
42d0: 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20    /* If mapping 
42e0: 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68  failed, close th
42f0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
4300: 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65  handle and erase
4310: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 21   it */.    if (!
4320: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 7b 0a  pFile->shared){.
4330: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
4340: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
4350: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77  Error();.      w
4360: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
4370: 45 5f 45 52 52 4f 52 2c 20 22 77 69 6e 63 65 43  E_ERROR, "winceC
4380: 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69  reateLock2", zFi
4390: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 43  lename);.      C
43a0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
43b0: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20  ->hShared);.    
43c0: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
43d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
43e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72   }..  /* If shar
43f0: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20  ed memory could 
4400: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20  not be created, 
4410: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d  then close the m
4420: 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f  utex and fail */
4430: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53  .  if (pFile->hS
4440: 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a  hared == NULL){.
4450: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
4460: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
4470: 74 65 78 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48  tex);.    CloseH
4480: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
4490: 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
44a0: 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
44b0: 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45      return FALSE
44c0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e  ;.  }.  .  /* In
44d0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61  itialize the sha
44e0: 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65  red memory if we
44f0: 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20  're supposed to 
4500: 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20  */.  if (bInit) 
4510: 7b 0a 20 20 20 20 5a 65 72 6f 4d 65 6d 6f 72 79  {.    ZeroMemory
4520: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20  (pFile->shared, 
4530: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
4540: 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
4550: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
4560: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
4570: 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f  eturn TRUE;.}../
4580: 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
4590: 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
45a0: 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
45b0: 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
45c0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
45d0: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
45e0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
45f0: 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
4600: 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
4610: 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
4620: 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
4630: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
4640: 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
4650: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
4660: 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
4670: 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
4680: 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
4690: 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
46a0: 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
46b0: 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
46c0: 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
46d0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
46e0: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
46f0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
4700: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
4710: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
4720: 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
4730: 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
4740: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
4750: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
4760: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
4770: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
4780: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
4790: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
47a0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
47b0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
47c0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
47d0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
47e0: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
47f0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
4800: 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
4810: 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
4820: 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
4830: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
4840: 64 6c 65 20 2a 2f 0a 20 20 20 20 55 6e 6d 61 70  dle */.    Unmap
4850: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
4860: 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20 43  ->shared);.    C
4870: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
4880: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20  ->hShared);..   
4890: 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68   /* Done with th
48a0: 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
48b0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
48c0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
48d0: 20 20 20 20 0a 20 20 20 20 43 6c 6f 73 65 48 61      .    CloseHa
48e0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
48f0: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
4900: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
4910: 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20   }.}../* .** An 
4920: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
4930: 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29  f the LockFile()
4940: 20 41 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20   API of windows 
4950: 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61  for wince.*/.sta
4960: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f  tic BOOL winceLo
4970: 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c 45  ckFile(.  HANDLE
4980: 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52   *phFile,.  DWOR
4990: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
49a0: 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
49b0: 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
49c0: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
49d0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
49e0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
49f0: 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
4a00: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
4a10: 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
4a20: 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
4a30: 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
4a40: 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
4a50: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
4a60: 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
4a70: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4a80: 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
4a90: 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
4aa0: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
4ab0: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
4ac0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
4ad0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
4ae0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
4af0: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
4b00: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
4b10: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
4b20: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
4b30: 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
4b40: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
4b50: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
4b60: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
4b70: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
4b80: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
4b90: 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
4ba0: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
4bb0: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
4bc0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
4bd0: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
4be0: 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
4bf0: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
4c00: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
4c10: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
4c20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
4c30: 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
4c40: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
4c50: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
4c60: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
4c70: 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
4c80: 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
4c90: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
4ca0: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
4cb0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
4cc0: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
4cd0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
4ce0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
4cf0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
4d00: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
4d10: 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
4d20: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
4d30: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
4d40: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
4d50: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
4d60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
4d70: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
4d80: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
4d90: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
4da0: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
4db0: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
4dc0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
4dd0: 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
4de0: 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
4df0: 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
4e00: 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
4e10: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
4e20: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
4e30: 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
4e40: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
4e50: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
4e60: 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
4e70: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
4e80: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
4e90: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
4ea0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
4eb0: 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
4ec0: 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
4ed0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
4ee0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
4ef0: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
4f00: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
4f10: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
4f20: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
4f30: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
4f40: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
4f50: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
4f60: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
4f70: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
4f80: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
4f90: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
4fa0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
4fb0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
4fc0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
4fd0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
4fe0: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
4ff0: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
5000: 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
5010: 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 77 69 6e  kFile API of win
5020: 64 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a  dows for wince.*
5030: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
5040: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  nceUnlockFile(. 
5050: 20 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c   HANDLE *phFile,
5060: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
5070: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
5080: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
5090: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
50a0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
50b0: 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
50c0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
50d0: 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  nlockHigh.){.  w
50e0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
50f0: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
5100: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
5110: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
5120: 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
5130: 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
5140: 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
5150: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
5160: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
5170: 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20  ockHigh);..  if 
5180: 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  (!pFile->hMutex)
5190: 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
51a0: 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
51b0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
51c0: 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  ;..  /* Releasin
51d0: 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20  g a reader lock 
51e0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
51f0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77  lock */.  if (dw
5200: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
5210: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
5220: 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69  IRST){.    /* Di
5230: 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63  d we have an exc
5240: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
5250: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
5260: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
5270: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  {.      assert(n
5280: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
5290: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f  nlockLow == (DWO
52a0: 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b  RD)SHARED_SIZE);
52b0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
52c0: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
52d0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
52e0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
52f0: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
5300: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
5310: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20   TRUE;.    }..  
5320: 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74    /* Did we just
5330: 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c   have a reader l
5340: 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ock? */.    else
5350: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
5360: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
5370: 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
5380: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
5390: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
53a0: 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75  ARED_SIZE || nNu
53b0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
53c0: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20  ockLow == 1);.  
53d0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
53e0: 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  .nReaders --;.  
53f0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
5400: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
5410: 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   0).      {.    
5420: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
5430: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
5440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
5450: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
5460: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
5470: 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e  leasing a pendin
5480: 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  g lock */.  else
5490: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
54a0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
54b0: 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20 6e  ENDING_BYTE && n
54c0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
54d0: 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
54e0: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
54f0: 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
5500: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
5510: 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
5520: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
5530: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
5540: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
5550: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
5560: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
5570: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
5580: 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
5590: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
55a0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
55b0: 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
55c0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
55d0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
55e0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
55f0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
5600: 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
5610: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
5620: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
5630: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
5640: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
5650: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
5660: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
5670: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
5680: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
5690: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
56a0: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
56b0: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
56c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
56d0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 20 6f  ckFileEx() API o
56e0: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
56f0: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
5700: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
5710: 45 78 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68  Ex(.  HANDLE *ph
5720: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77  File,.  DWORD dw
5730: 46 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 64  Flags,.  DWORD d
5740: 77 52 65 73 65 72 76 65 64 2c 0a 20 20 44 57 4f  wReserved,.  DWO
5750: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
5760: 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
5770: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
5780: 65 73 54 6f 4c 6f 63 6b 48 69 67 68 2c 0a 20 20  esToLockHigh,.  
5790: 4c 50 4f 56 45 52 4c 41 50 50 45 44 20 6c 70 4f  LPOVERLAPPED lpO
57a0: 76 65 72 6c 61 70 70 65 64 0a 29 7b 0a 20 20 55  verlapped.){.  U
57b0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
57c0: 64 77 52 65 73 65 72 76 65 64 29 3b 0a 20 20 55  dwReserved);.  U
57d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
57e0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
57f0: 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 2f 2a  LockHigh);..  /*
5800: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 77   If the caller w
5810: 61 6e 74 73 20 61 20 73 68 61 72 65 64 20 72 65  ants a shared re
5820: 61 64 20 6c 6f 63 6b 2c 20 66 6f 72 77 61 72 64  ad lock, forward
5830: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
5840: 74 6f 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  to winceLockFile
5850: 20 2a 2f 0a 20 20 69 66 20 28 6c 70 4f 76 65 72   */.  if (lpOver
5860: 6c 61 70 70 65 64 2d 3e 4f 66 66 73 65 74 20 3d  lapped->Offset =
5870: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
5880: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 64  FIRST &&.      d
5890: 77 46 6c 61 67 73 20 3d 3d 20 31 20 26 26 0a 20  wFlags == 1 &&. 
58a0: 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79       nNumberOfBy
58b0: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
58c0: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
58d0: 5a 45 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ZE){.    return 
58e0: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
58f0: 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
5900: 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ST, 0, 1, 0);.  
5910: 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45  }.  return FALSE
5920: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
5930: 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
5940: 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e for wince.****
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
59a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
59b0: 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  INCE */../******
59c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
59e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
5a10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
5a20: 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
5a30: 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
5a40: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
5a50: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
5a60: 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
5ac0: 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69 63 72 6f  /*.** Some micro
5ad0: 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
5ae0: 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
5af0: 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
5b00: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
5b10: 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
5b20: 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
5b30: 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
5b40: 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
5b50: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
5b60: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
5b70: 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
5b80: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
5b90: 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
5ba0: 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
5bb0: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
5bc0: 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
5bd0: 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a  ful, return 0. .
5be0: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
5bf0: 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
5c00: 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
5c10: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
5c20: 63 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c  c int seekWinFil
5c30: 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
5c40: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
5c50: 69 4f 66 66 73 65 74 29 7b 0a 20 20 4c 4f 4e 47  iOffset){.  LONG
5c60: 20 75 70 70 65 72 42 69 74 73 3b 20 20 20 20 20   upperBits;     
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
5c80: 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ost sig. 32 bits
5c90: 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
5ca0: 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69  /.  LONG lowerBi
5cb0: 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ts;             
5cc0: 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67      /* Least sig
5cd0: 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
5ce0: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f   offset */.  DWO
5cf0: 52 44 20 64 77 52 65 74 3b 20 20 20 20 20 20 20  RD dwRet;       
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d10: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
5d20: 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
5d30: 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69  () */..  upperBi
5d40: 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66  ts = (LONG)((iOf
5d50: 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
5d60: 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72  ffffff);.  lower
5d70: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  Bits = (LONG)(iO
5d80: 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
5d90: 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f  ff);..  /* API o
5da0: 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73  ddity: If succes
5db0: 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69  sful, SetFilePoi
5dc0: 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61  nter() returns a
5dd0: 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e   dword .  ** con
5de0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65  taining the lowe
5df0: 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65  r 32-bits of the
5e00: 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74   new file-offset
5e10: 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c  . Or, if it fail
5e20: 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72  s,.  ** it retur
5e30: 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ns INVALID_SET_F
5e40: 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77  ILE_POINTER. How
5e50: 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74  ever according t
5e60: 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e  o MSDN, .  ** IN
5e70: 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
5e80: 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
5e90: 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
5ea0: 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
5eb0: 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
5ec0: 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61  ther an error ha
5ed0: 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72  s actually occur
5ee0: 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
5ef0: 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
5f00: 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72   .  ** GetLastEr
5f10: 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77  ror()..  */.  dw
5f20: 52 65 74 20 3d 20 53 65 74 46 69 6c 65 50 6f 69  Ret = SetFilePoi
5f30: 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c  nter(pFile->h, l
5f40: 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72  owerBits, &upper
5f50: 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e  Bits, FILE_BEGIN
5f60: 29 3b 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  );.  if( (dwRet=
5f70: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
5f80: 45 5f 50 4f 49 4e 54 45 52 20 26 26 20 47 65 74  E_POINTER && Get
5f90: 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 4e 4f 5f  LastError()!=NO_
5fa0: 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 70 46  ERROR) ){.    pF
5fb0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
5fc0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
5fd0: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
5fe0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
5ff0: 45 4b 2c 20 22 73 65 65 6b 57 69 6e 46 69 6c 65  EK, "seekWinFile
6000: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
6010: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
6020: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b    }..  return 0;
6030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6040: 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
6050: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
6060: 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
6070: 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
6080: 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
6090: 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
60a0: 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
60b0: 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
60c0: 20 77 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   windows is noto
60d0: 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
60e0: 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
60f0: 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
6100: 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
6110: 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
6120: 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
6130: 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
6140: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
6150: 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
6160: 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
6170: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
6180: 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
6190: 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
61a0: 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
61b0: 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
61c0: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
61d0: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
61e0: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
61f0: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
6200: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
6210: 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
6220: 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
6230: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
6240: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
6250: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
6260: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68  sert( pFile->pSh
6270: 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  m==0 );.  OSTRAC
6280: 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
6290: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64   pFile->h));.  d
62a0: 6f 7b 0a 20 20 20 20 72 63 20 3d 20 43 6c 6f 73  o{.    rc = Clos
62b0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
62c0: 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61  );.    /* Simula
62d0: 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b  teIOError( rc=0;
62e0: 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54   cnt=MX_CLOSE_AT
62f0: 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d  TEMPT; ); */.  }
6300: 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
6310: 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45  ++cnt < MX_CLOSE
6320: 5f 41 54 54 45 4d 50 54 20 26 26 20 28 53 6c 65  _ATTEMPT && (Sle
6330: 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
6340: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6350: 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
6360: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
6370: 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74  TS 3.  winceDest
6380: 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  royLock(pFile);.
6390: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
63a0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
63b0: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
63c0: 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20      while(.     
63d0: 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65        DeleteFile
63e0: 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
63f0: 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
6400: 20 20 20 20 26 26 20 47 65 74 46 69 6c 65 41 74      && GetFileAt
6410: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
6420: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
6430: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
6440: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
6450: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
6460: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
6470: 20 20 20 20 20 20 20 53 6c 65 65 70 28 31 30 30         Sleep(100
6480: 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69  );  /* Wait a li
6490: 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69  ttle before tryi
64a0: 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ng again */.    
64b0: 7d 0a 20 20 20 20 66 72 65 65 28 70 46 69 6c 65  }.    free(pFile
64c0: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
64d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
64e0: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
64f0: 25 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  %d %s\n", pFile-
6500: 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
6510: 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 4f 70  "failed"));.  Op
6520: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
6530: 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
6540: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
6550: 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
6560: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
6570: 4f 53 45 2c 20 22 77 69 6e 43 6c 6f 73 65 22 2c  OSE, "winClose",
6580: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
6590: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
65a0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
65b0: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
65c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
65d0: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
65e0: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
65f0: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
6600: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
6610: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
6620: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
6630: 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
6640: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
6650: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
6660: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
6670: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
6680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
6690: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
66a0: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
66b0: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
66d0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
66e0: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
66f0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
6700: 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
6710: 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
6720: 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  s offset */.){. 
6730: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
6740: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
6750: 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   /* file handle 
6760: 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64  */.  DWORD nRead
6770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6780: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6790: 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
67a0: 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20   read from file 
67b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
67c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
67d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
67e0: 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61  f retrys */..  a
67f0: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
6800: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
6810: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
6820: 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f  IOERR_READ);.  O
6830: 53 54 52 41 43 45 28 28 22 52 45 41 44 20 25 64  STRACE(("READ %d
6840: 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
6850: 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
6860: 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 69 66 28  cktype));..  if(
6870: 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
6880: 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20  le, offset) ){. 
6890: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
68a0: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69  _FULL;.  }.  whi
68b0: 6c 65 28 20 21 52 65 61 64 46 69 6c 65 28 70 46  le( !ReadFile(pF
68c0: 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
68d0: 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
68e0: 0a 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f  .    if( retryIo
68f0: 65 72 72 28 26 6e 52 65 74 72 79 29 20 29 20 63  err(&nRetry) ) c
6900: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
6910: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
6920: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
6930: 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
6940: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
6950: 45 52 52 5f 52 45 41 44 2c 20 22 77 69 6e 52 65  ERR_READ, "winRe
6960: 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ad", pFile->zPat
6970: 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f 65  h);.  }.  logIoe
6980: 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66  rr(nRetry);.  if
6990: 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61  ( nRead<(DWORD)a
69a0: 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72  mt ){.    /* Unr
69b0: 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
69c0: 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
69d0: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
69e0: 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
69f0: 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c  r*)pBuf)[nRead],
6a00: 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a   0, amt-nRead);.
6a10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6a20: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
6a30: 41 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  AD;.  }..  retur
6a40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6a50: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61  /*.** Write data
6a60: 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69   from a buffer i
6a70: 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74  nto a file.  Ret
6a80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
6a90: 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73   success.** or s
6aa0: 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
6ab0: 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e  code on failure.
6ac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
6ad0: 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  inWrite(.  sqlit
6ae0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
6af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
6b00: 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  le to write into
6b10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6b20: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
6b30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
6b40: 65 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  es to be written
6b50: 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6b80: 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74  of bytes to writ
6b90: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
6ba0: 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
6bb0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6bc0: 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74   into the file t
6bd0: 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
6be0: 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  at */.){.  int r
6bf0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
6c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6c10: 75 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20  ue if error has 
6c20: 6f 63 63 75 72 65 64 2c 20 65 6c 73 65 20 66 61  occured, else fa
6c30: 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
6c40: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
6c50: 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
6c60: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
6c70: 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c90: 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
6ca0: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
6cb0: 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
6cc0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
6cd0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
6ce0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
6cf0: 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
6d00: 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
6d10: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
6d20: 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
6d30: 45 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63  E(("WRITE %d loc
6d40: 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
6d50: 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
6d60: 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d 20 73 65  pe));..  rc = se
6d70: 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c  ekWinFile(pFile,
6d80: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
6d90: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  rc==0 ){.    u8 
6da0: 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42  *aRem = (u8 *)pB
6db0: 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  uf;        /* Da
6dc0: 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  ta yet to be wri
6dd0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
6de0: 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20  nRem = amt;     
6df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6e00: 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74  ber of bytes yet
6e10: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
6e20: 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69  /.    DWORD nWri
6e30: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
6e40: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69      /* Bytes wri
6e50: 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69  tten by each Wri
6e60: 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f  teFile() call */
6e70: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65  ..    while( nRe
6e80: 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  m>0 ){.      if(
6e90: 20 21 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c   !WriteFile(pFil
6ea0: 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
6eb0: 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b  , &nWrite, 0) ){
6ec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
6ed0: 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 29  ryIoerr(&nRetry)
6ee0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6ef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6f00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57    }.      if( nW
6f10: 72 69 74 65 3c 3d 30 20 29 20 62 72 65 61 6b 3b  rite<=0 ) break;
6f20: 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
6f30: 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
6f40: 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
6f50: 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
6f60: 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
6f70: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
6f80: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
6f90: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
6fa0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  }.  }..  if( rc 
6fb0: 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20 70  ){.    if(   ( p
6fc0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
6fd0: 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49  =ERROR_HANDLE_DI
6fe0: 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20  SK_FULL ).      
6ff0: 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73   || ( pFile->las
7000: 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49  tErrno==ERROR_DI
7010: 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20  SK_FULL )){.    
7020: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7030: 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
7040: 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
7050: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
7060: 57 52 49 54 45 2c 20 22 77 69 6e 57 72 69 74 65  WRITE, "winWrite
7070: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
7080: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
7090: 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
70a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
70b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
70c0: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
70d0: 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
70e0: 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
70f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
7100: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
7110: 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
7120: 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
7130: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
7140: 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
7150: 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
7160: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
7170: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
7180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7190: 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
71a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
71b0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
71c0: 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
71d0: 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64  TRUNCATE %d %lld
71e0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
71f0: 42 79 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61  Byte));.  Simula
7200: 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
7210: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
7220: 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49  UNCATE);..  /* I
7230: 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
7240: 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
7250: 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
7260: 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
7270: 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
7280: 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
7290: 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
72a0: 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
72b0: 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
72c0: 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
72d0: 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
72e0: 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
72f0: 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
7300: 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
7310: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
7320: 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b 0a 20 20  e->szChunk ){.  
7330: 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
7340: 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
7350: 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
7360: 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
7370: 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
7380: 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65   /* SetEndOfFile
7390: 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  () returns non-z
73a0: 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73  ero when success
73b0: 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65  ful, or zero whe
73c0: 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  n it fails. */. 
73d0: 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65   if( seekWinFile
73e0: 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29  (pFile, nByte) )
73f0: 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
7400: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
7410: 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 77  ERR_TRUNCATE, "w
7420: 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46  inTruncate1", pF
7430: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
7440: 65 6c 73 65 20 69 66 28 20 30 3d 3d 53 65 74 45  else if( 0==SetE
7450: 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ndOfFile(pFile->
7460: 68 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  h) ){.    pFile-
7470: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
7480: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
7490: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
74a0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
74b0: 52 55 4e 43 41 54 45 2c 20 22 77 69 6e 54 72 75  RUNCATE, "winTru
74c0: 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
74d0: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f  zPath);.  }..  O
74e0: 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
74f0: 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c  E %d %lld %s\n",
7500: 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
7510: 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20  , rc ? "failed" 
7520: 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
7530: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
7540: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
7550: 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
7560: 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
7570: 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
7580: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
7590: 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
75a0: 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
75b0: 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e  yncs are occurin
75c0: 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
75d0: 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
75e0: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
75f0: 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
7600: 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
7610: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
7620: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
7630: 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
7640: 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
7650: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
7660: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
7670: 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65  t winSync(sqlite
7680: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
7690: 66 6c 61 67 73 29 7b 0a 23 69 66 20 21 64 65 66  flags){.#if !def
76a0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
76b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
76c0: 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 64 65 66 69  NO_SYNC) || defi
76d0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
76e0: 29 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ).  winFile *pFi
76f0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
7700: 64 3b 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65  d;.  BOOL rc;.#e
7710: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
7720: 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64  AMETER(id);.#end
7730: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
7740: 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63  ile );.  /* Chec
7750: 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
7760: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
7770: 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
7780: 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
7790: 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
77a0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
77b0: 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
77c0: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
77d0: 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
77e0: 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
77f0: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
7800: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
7810: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
7820: 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
7830: 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
7840: 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
7850: 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
7860: 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
7870: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
7880: 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
7890: 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
78a0: 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
78b0: 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
78c0: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
78d0: 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e  TE_FULL );..#ifn
78e0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
78f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
7900: 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
7910: 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
7920: 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
7930: 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
7940: 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
7950: 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
7960: 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
7970: 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
7980: 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
7990: 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
79a0: 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
79b0: 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
79c0: 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
79d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
79e0: 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51  SYNC.  return SQ
79f0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
7a00: 20 72 63 20 3d 20 46 6c 75 73 68 46 69 6c 65 42   rc = FlushFileB
7a10: 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
7a20: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
7a30: 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
7a40: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
7a50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7a60: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
7a70: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
7a80: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
7a90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
7aa0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
7ab0: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 77  _IOERR_FSYNC, "w
7ac0: 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  inSync", pFile->
7ad0: 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  zPath);.  }.#end
7ae0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  if.}../*.** Dete
7af0: 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
7b00: 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
7b10: 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
7b20: 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53  tic int winFileS
7b30: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
7b40: 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e   *id, sqlite3_in
7b50: 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 44  t64 *pSize){.  D
7b60: 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a  WORD upperBits;.
7b70: 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74    DWORD lowerBit
7b80: 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  s;.  winFile *pF
7b90: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
7ba0: 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f  id;.  DWORD erro
7bb0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  r;..  assert( id
7bc0: 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
7bd0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
7be0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
7bf0: 41 54 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73  AT);.  lowerBits
7c00: 20 3d 20 47 65 74 46 69 6c 65 53 69 7a 65 28 70   = GetFileSize(p
7c10: 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42  File->h, &upperB
7c20: 69 74 73 29 3b 0a 20 20 69 66 28 20 20 20 28 6c  its);.  if(   (l
7c30: 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
7c40: 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
7c50: 20 20 20 20 26 26 20 28 28 65 72 72 6f 72 20 3d      && ((error =
7c60: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
7c70: 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 29 20 29 0a   != NO_ERROR) ).
7c80: 20 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c    {.    pFile->l
7c90: 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72  astErrno = error
7ca0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
7cb0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
7cc0: 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 22 77 69  IOERR_FSTAT, "wi
7cd0: 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
7ce0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
7cf0: 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
7d00: 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
7d10: 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
7d20: 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75 72 6e  erBits;.  return
7d30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
7d40: 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  *.** LOCKFILE_FA
7d50: 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69  IL_IMMEDIATELY i
7d60: 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73  s undefined on s
7d70: 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74  ome Windows syst
7d80: 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ems..*/.#ifndef 
7d90: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
7da0: 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69  MEDIATELY.# defi
7db0: 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ne LOCKFILE_FAIL
7dc0: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23  _IMMEDIATELY 1.#
7dd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  endif../*.** Acq
7de0: 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f  uire a reader lo
7df0: 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ck..** Different
7e00: 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
7e10: 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
7e20: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
7e30: 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
7e40: 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win95 or WinNT..
7e50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
7e60: 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
7e70: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
7e80: 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
7e90: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
7ea0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6f  PPED ovlp;.    o
7eb0: 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 53 48 41  vlp.Offset = SHA
7ec0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6f  RED_FIRST;.    o
7ed0: 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
7ee0: 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e 68 45 76   0;.    ovlp.hEv
7ef0: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 73  ent = 0;.    res
7f00: 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 70 46   = LockFileEx(pF
7f10: 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45  ile->h, LOCKFILE
7f20: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
7f30: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
7f40: 20 20 20 20 20 20 20 20 30 2c 20 53 48 41 52 45          0, SHARE
7f50: 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f 76 6c 70  D_SIZE, 0, &ovlp
7f60: 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  );./* isNT() is 
7f70: 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
7f80: 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
7f90: 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
7fa0: 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66  xecuted. .*/.#if
7fb0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7fc0: 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
7fd0: 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
7fe0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7ff0: 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
8000: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
8010: 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
8020: 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
8030: 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
8040: 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
8050: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
8060: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
8070: 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
8080: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
8090: 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  1, 0);.#endif.  
80a0: 7d 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30  }.  if( res == 0
80b0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
80c0: 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
80d0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
80e0: 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
80f0: 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
8100: 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ck */.  }.  retu
8110: 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
8120: 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
8130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
8140: 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
8150: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
8160: 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20   int res;.  if( 
8170: 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  isNT() ){.    re
8180: 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70  s = UnlockFile(p
8190: 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
81a0: 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
81b0: 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69 73  _SIZE, 0);./* is
81c0: 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
81d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
81e0: 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
81f0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
8200: 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f   .*/.#if SQLITE_
8210: 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65  OS_WINCE==0.  }e
8220: 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  lse{.    res = U
8230: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
8240: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
8250: 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64   + pFile->shared
8260: 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
8270: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  0);.#endif.  }. 
8280: 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 47   if( res==0 && G
8290: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45  etLastError()!=E
82a0: 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 20  RROR_NOT_LOCKED 
82b0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
82c0: 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
82d0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69  tError();.    wi
82e0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
82f0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22  _IOERR_UNLOCK, "
8300: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c  unlockReadLock",
8310: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
8320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
8330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
8340: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
8350: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
8360: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
8370: 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
8380: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
8390: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
83a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
83b0: 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
83c0: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
83d0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
83e0: 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
83f0: 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
8400: 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
8410: 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
8420: 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
8430: 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
8440: 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
8450: 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
8460: 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
8470: 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
8480: 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
8490: 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
84a0: 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
84b0: 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
84c0: 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
84d0: 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
84e0: 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
84f0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
8500: 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
8510: 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
8520: 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
8530: 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
8540: 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
8550: 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
8560: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
8570: 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
8580: 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
8590: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
85a0: 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
85b0: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
85c0: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
85d0: 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
85e0: 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
85f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
8600: 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
8610: 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
8620: 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
8630: 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
8640: 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
8650: 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
8660: 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
8670: 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
8680: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
8690: 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
86a0: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
86b0: 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
86c0: 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
86d0: 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
86e0: 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
86f0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
8700: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
8710: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
8720: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8730: 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
8740: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
8750: 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
8760: 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
8770: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
8780: 20 6f 66 20 61 20 77 69 6e 64 6f 77 73 20 6c 6f   of a windows lo
8790: 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
87a0: 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
87b0: 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
87c0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
87d0: 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
87e0: 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
87f0: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
8800: 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
8810: 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
8820: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
8830: 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
8840: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
8850: 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
8860: 65 72 72 6f 72 20 3d 20 4e 4f 5f 45 52 52 4f 52  error = NO_ERROR
8870: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
8880: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
8890: 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73  ("LOCK %d %d was
88a0: 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
88b0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
88c0: 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65   locktype, pFile
88d0: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
88e0: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
88f0: 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
8900: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
8910: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
8920: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
8930: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
8940: 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f  ** OsFile, do no
8950: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
8960: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
8970: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
8980: 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72  * sqlite3OsEnter
8990: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
89a0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
89b0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
89c0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b  ->locktype>=lock
89d0: 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75  type ){.    retu
89e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
89f0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
8a00: 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
8a10: 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
8a20: 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
8a30: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
8a40: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
8a50: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
8a60: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
8a70: 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
8a80: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
8a90: 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
8aa0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
8ab0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
8ac0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
8ad0: 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
8ae0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
8af0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
8b00: 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
8b10: 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
8b20: 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
8b30: 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
8b40: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
8b50: 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
8b60: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
8b70: 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
8b80: 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
8b90: 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
8ba0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
8bb0: 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65  ;.  if(   (pFile
8bc0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
8bd0: 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20  OCK).     || (  
8be0: 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c   (locktype==EXCL
8bf0: 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20  USIVE_LOCK).    
8c00: 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e       && (pFile->
8c10: 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56  locktype==RESERV
8c20: 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
8c30: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
8c40: 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
8c50: 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63  >0 && (res = Loc
8c60: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
8c70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
8c80: 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
8c90: 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d      /* Try 3 tim
8ca0: 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65  es to get the pe
8cb0: 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 65  nding lock.  The
8cc0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d 69   pending lock mi
8cd0: 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ght be.      ** 
8ce0: 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
8cf0: 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20 77  reader process w
8d00: 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  ho will release 
8d10: 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e 0a  it momentarily..
8d20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4f        */.      O
8d30: 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20 6e  STRACE(("could n
8d40: 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47  ot get a PENDING
8d50: 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22   lock. cnt=%d\n"
8d60: 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20 53  , cnt));.      S
8d70: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
8d80: 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
8d90: 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  k = res;.    if(
8da0: 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 65   !res ){.      e
8db0: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
8dc0: 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
8dd0: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
8de0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
8df0: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
8e00: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
8e10: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
8e20: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
8e30: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
8e40: 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61      res = getRea
8e50: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
8e60: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
8e70: 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
8e80: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
8e90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
8ea0: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
8eb0: 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
8ec0: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
8ed0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
8ee0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
8ef0: 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
8f00: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
8f10: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
8f20: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
8f30: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
8f40: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
8f50: 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
8f60: 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
8f70: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
8f80: 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
8f90: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a   RESERVED_LOCK;.
8fa0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8fb0: 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74   error = GetLast
8fc0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
8fd0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
8fe0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
8ff0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
9000: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
9010: 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
9020: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
9030: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
9040: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
9050: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
9060: 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
9070: 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
9080: 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
9090: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
90a0: 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
90b0: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
90c0: 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
90d0: 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e   );.    res = un
90e0: 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
90f0: 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  le);.    OSTRACE
9100: 28 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20  (("unreadlock = 
9110: 25 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20  %d\n", res));.  
9120: 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65    res = LockFile
9130: 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  (pFile->h, SHARE
9140: 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
9150: 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
9160: 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
9170: 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
9180: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
9190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
91a0: 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74   error = GetLast
91b0: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
91c0: 53 54 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63  STRACE(("error-c
91d0: 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 65 72 72  ode = %d\n", err
91e0: 6f 72 29 29 3b 0a 20 20 20 20 20 20 67 65 74 52  or));.      getR
91f0: 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
9200: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9210: 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
9220: 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
9230: 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
9240: 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
9250: 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
9260: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
9270: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
9280: 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
9290: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
92a0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
92b0: 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
92c0: 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
92d0: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
92e0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c  e state of the l
92f0: 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20  ock has held in 
9300: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
9310: 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  tor then.  ** re
9320: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
9330: 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65  iate result code
9340: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
9350: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
9360: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
9370: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
9380: 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72  OCK FAILED %d tr
9390: 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20  ying for %d but 
93a0: 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  got %d\n", pFile
93b0: 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
93c0: 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
93d0: 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69  ktype));.    pFi
93e0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
93f0: 65 72 72 6f 72 3b 0a 20 20 20 20 72 63 20 3d 20  error;.    rc = 
9400: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
9410: 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
9420: 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b  pe = (u8)newLock
9430: 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
9440: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
9450: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9460: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
9470: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
9480: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
9490: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
94a0: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
94b0: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
94c0: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
94d0: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
94e0: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
94f0: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
9500: 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
9510: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
9520: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
9530: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
9540: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
9550: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
9560: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
9570: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
9580: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
9590: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
95a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
95b0: 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
95c0: 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45  ->locktype>=RESE
95d0: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
95e0: 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54   rc = 1;.    OST
95f0: 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
9600: 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c  OCK %d %d (local
9610: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
9620: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
9630: 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65     rc = LockFile
9640: 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  (pFile->h, RESER
9650: 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
9660: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
9670: 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69  {.      UnlockFi
9680: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  le(pFile->h, RES
9690: 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
96a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
96b0: 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53  rc = !rc;.    OS
96c0: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
96d0: 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f  LOCK %d %d (remo
96e0: 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
96f0: 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  , rc));.  }.  *p
9700: 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72  ResOut = rc;.  r
9710: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
9730: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
9740: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
9750: 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
9760: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
9770: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
9780: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
9790: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
97a0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
97b0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
97c0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
97d0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
97e0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
97f0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
9800: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
9810: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
9820: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
9830: 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
9840: 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
9850: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
9860: 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
9870: 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
9880: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
9890: 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
98a0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
98b0: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
98c0: 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
98d0: 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
98e0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
98f0: 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
9900: 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  ){.  int type;. 
9910: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
9920: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
9930: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9940: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
9950: 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  pFile!=0 );.  as
9960: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
9970: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9980: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
9990: 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20 25  K %d to %d was %
99a0: 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  d(%d)\n", pFile-
99b0: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20  >h, locktype,.  
99c0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
99d0: 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
99e0: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29  sharedLockByte))
99f0: 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
9a00: 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
9a10: 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
9a20: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e  E_LOCK ){.    Un
9a30: 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  lockFile(pFile->
9a40: 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
9a50: 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
9a60: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63   0);.    if( loc
9a70: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
9a80: 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f  CK && !getReadLo
9a90: 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
9aa0: 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
9ab0: 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
9ac0: 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
9ad0: 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
9ae0: 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
9af0: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
9b00: 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
9b10: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
9b20: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 22 77 69  OERR_UNLOCK, "wi
9b30: 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  nUnlock", pFile-
9b40: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
9b50: 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
9b60: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
9b70: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
9b80: 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
9b90: 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
9ba0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  ;.  }.  if( lock
9bb0: 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  type==NO_LOCK &&
9bc0: 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f   type>=SHARED_LO
9bd0: 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  CK ){.    unlock
9be0: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
9bf0: 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e  .  }.  if( type>
9c00: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b  =PENDING_LOCK ){
9c10: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
9c20: 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
9c30: 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
9c40: 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
9c50: 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
9c60: 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
9c70: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
9c80: 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
9c90: 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
9ca0: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
9cb0: 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
9cc0: 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
9cd0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
9ce0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73  void *pArg){.  s
9cf0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
9d00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
9d10: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
9d20: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
9d30: 67 20 3d 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  g = ((winFile*)i
9d40: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  d)->locktype;.  
9d50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d60: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
9d70: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
9d80: 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
9d90: 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
9da0: 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a 29 69 64  nt)((winFile*)id
9db0: 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  )->lastErrno;.  
9dc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9dd0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
9de0: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
9df0: 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
9e00: 20 20 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a        ((winFile*
9e10: 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  )id)->szChunk = 
9e20: 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
9e30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9e40: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
9e50: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
9e60: 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20  L_SIZE_HINT: {. 
9e70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
9e80: 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c 69 74 65  64 sz = *(sqlite
9e90: 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20  3_int64*)pArg;. 
9ea0: 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
9eb0: 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
9ec0: 20 20 20 20 20 77 69 6e 54 72 75 6e 63 61 74 65       winTruncate
9ed0: 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  (id, sz);.      
9ee0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
9ef0: 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
9f00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9f10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9f20: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59   SQLITE_FCNTL_SY
9f30: 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b 0a 20 20  NC_OMITTED: {.  
9f40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9f50: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
9f60: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
9f70: 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
9f80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
9f90: 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
9fa0: 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
9fb0: 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32  ){.        win32
9fc0: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
9fd0: 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
9fe0: 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
9ff0: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a  in32IoerrRetry;.
a000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a010: 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[1]>0 ){.    
a020: 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
a030: 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b  tryDelay = a[1];
a040: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a050: 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e        a[1] = win
a060: 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
a070: 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
a080: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a090: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
a0a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
a0b0: 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
a0c0: 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
a0d0: 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
a0e0: 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
a0f0: 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
a100: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
a110: 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
a120: 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
a130: 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
a140: 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
a150: 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
a160: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
a170: 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
a180: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
a190: 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
a1a0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
a1b0: 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
a1c0: 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
a1d0: 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
a1e0: 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
a1f0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
a200: 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
a210: 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
a220: 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
a230: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
a240: 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
a250: 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
a260: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
a270: 2a 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  *id){.  assert( 
a280: 69 64 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  id!=0 );.  retur
a290: 6e 20 28 69 6e 74 29 28 28 28 77 69 6e 46 69 6c  n (int)(((winFil
a2a0: 65 2a 29 69 64 29 2d 3e 73 65 63 74 6f 72 53 69  e*)id)->sectorSi
a2b0: 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ze);.}../*.** Re
a2c0: 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66  turn a vector of
a2d0: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
a2e0: 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74  ristics..*/.stat
a2f0: 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65  ic int winDevice
a300: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
a310: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
a320: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
a330: 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65 74  METER(id);.  ret
a340: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
a350: 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
a360: 4e 5f 4f 50 45 4e 3b 0a 7d 0a 0a 23 69 66 6e 64  N_OPEN;.}..#ifnd
a370: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
a380: 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f  AL../* .** Windo
a390: 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
a3a0: 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
a3b0: 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
a3c0: 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
a3d0: 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
a3e0: 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
a3f0: 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
a400: 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
a410: 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
a420: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
a430: 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
a440: 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20  .*/.SYSTEM_INFO 
a450: 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a  winSysInfo;../*.
a460: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
a470: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
a480: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
a490: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
a4a0: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
a4b0: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
a4c0: 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
a4d0: 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
a4e0: 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66  ed by .** this f
a4f0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
a500: 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20  h may be shared 
a510: 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  by multiple thre
a520: 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  ads..**.** Funct
a530: 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  ion winShmMutexH
a540: 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f  eld() is used to
a550: 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
a560: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
a570: 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e  .** is held when
a580: 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
a590: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
a5a0: 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66   used as part of
a5b0: 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
a5c0: 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
a5d0: 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
a5e0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
a5f0: 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
a600: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
a610: 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
a620: 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
a630: 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
a640: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
a650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a660: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
a670: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a680: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a690: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
a6a0: 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
a6b0: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
a6c0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
a6d0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
a6e0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
a6f0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
a700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a710: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
a720: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
a730: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
a740: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a750: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
a760: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
a770: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
a780: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
a790: 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
a7a0: 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73  to represent a s
a7b0: 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65  ingle file opene
a7c0: 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f  d and mmapped to
a7d0: 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72   provide.** shar
a7e0: 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e  ed memory.  When
a7f0: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
a800: 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
a810: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d  the same.** log-
a820: 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68  summary, each th
a830: 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e  read has its own
a840: 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c   winFile object,
a850: 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a   but they all.**
a860: 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67   point to a sing
a870: 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  le instance of t
a880: 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  his object.  In 
a890: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
a8a0: 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  h.** log-summary
a8b0: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20   is opened only 
a8c0: 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
a8d0: 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75  ..**.** winShmMu
a8e0: 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
a8f0: 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
a900: 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
a910: 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
a920: 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
a930: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
a940: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
a950: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
a960: 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78  Ref.**      pNex
a970: 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  t .**.** The fol
a980: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
a990: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
a9a0: 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
a9b0: 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
a9c0: 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
a9d0: 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
a9e0: 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
a9f0: 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
aa00: 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
aa10: 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
aa20: 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
aa30: 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
aa40: 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
aa50: 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
aa60: 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
aa70: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
aa80: 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
aa90: 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
aaa0: 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
aab0: 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
aac0: 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
aad0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
aae0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
aaf0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ab00: 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
ab10: 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
ab20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
ab30: 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
ab40: 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
ab50: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
ab60: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
ab70: 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
ab80: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
ab90: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
aba0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
abb0: 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
abc0: 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
abd0: 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
abe0: 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
abf0: 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
ac00: 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
ac10: 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
ac20: 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
ac30: 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
ac40: 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
ac50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
ac60: 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
ac70: 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
ac80: 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
ac90: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
aca0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
acb0: 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
acc0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
acd0: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
ace0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
acf0: 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
ad00: 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
ad10: 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
ad20: 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
ad30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
ad40: 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
ad50: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
ad60: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
ad70: 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65  TE_DEBUG.  u8 ne
ad80: 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
ad90: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
ada0: 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69  ailable winShm.i
adb0: 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
adc0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c  f.};../*.** A gl
add0: 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c  obal array of al
ade0: 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
adf0: 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ects..**.** The 
ae00: 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
ae10: 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
ae20: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
ae30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73  writing this lis
ae40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e  t..*/.static win
ae50: 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e  ShmNode *winShmN
ae60: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
ae70: 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73  .** Structure us
ae80: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79  ed internally by
ae90: 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63   this VFS to rec
aea0: 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66  ord the state of
aeb0: 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72   an.** open shar
aec0: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63  ed memory connec
aed0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
aee0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
aef0: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
af00: 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63   when this objec
af10: 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
af20: 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  .** are read-onl
af30: 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a  y thereafter:.**
af40: 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53  .**    winShm.pS
af50: 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e  hmNode.**    win
af60: 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c  Shm.id.**.** All
af70: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72   other fields ar
af80: 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54  e read/write.  T
af90: 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f  he winShm.pShmNo
afa0: 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  de->mutex must b
afb0: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20  e held.** while 
afc0: 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65  accessing any re
afd0: 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e  ad/write fields.
afe0: 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
aff0: 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  m {.  winShmNode
b000: 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20   *pShmNode;     
b010: 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
b020: 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ng winShmNode ob
b030: 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  ject */.  winShm
b040: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
b050: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e       /* Next win
b060: 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d  Shm with the sam
b070: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
b080: 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0a0: 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
b0b0: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d  the winShmNode m
b0c0: 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68  utex */.  u16 sh
b0d0: 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
b0e0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
b0f0: 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
b100: 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
b110: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
b120: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
b130: 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
b140: 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
b150: 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64  TE_DEBUG.  u8 id
b160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b170: 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
b180: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
b190: 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f  ith its winShmNo
b1a0: 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  de */.#endif.};.
b1b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
b1c0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
b1d0: 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  g.*/.#define WIN
b1e0: 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32  _SHM_BASE   ((22
b1f0: 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
b200: 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20  K)*4)        /* 
b210: 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20  first lock byte 
b220: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
b230: 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53  HM_DMS    (WIN_S
b240: 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
b250: 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
b260: 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
b270: 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76  ./*.** Apply adv
b280: 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
b290: 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69  all n bytes begi
b2a0: 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a  nning at ofst..*
b2b0: 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55  /.#define _SHM_U
b2c0: 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20  NLCK  1.#define 
b2d0: 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64  _SHM_RDLCK  2.#d
b2e0: 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b  efine _SHM_WRLCK
b2f0: 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77    3.static int w
b300: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
b310: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
b320: 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c  File,    /* Appl
b330: 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
b340: 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
b350: 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
b360: 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
b370: 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e        /* _SHM_UN
b380: 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c  LCK, _SHM_RDLCK,
b390: 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a   or _SHM_WRLCK *
b3a0: 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
b3b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b3c0: 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74  set to first byt
b3d0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75  e to be locked/u
b3e0: 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  nlocked */.  int
b3f0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20   nByte          
b400: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b410: 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72  bytes to lock or
b420: 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20   unlock */.){.  
b430: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
b440: 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73  .  DWORD dwFlags
b450: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  ;.  int rc = 0; 
b460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
b470: 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
b480: 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
b490: 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
b4a0: 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
b4b0: 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
b4c0: 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
b4d0: 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
b4e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b4f0: 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
b500: 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
b510: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
b520: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
b530: 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
b540: 73 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d  s */.  dwFlags =
b550: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
b560: 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69 66  MMEDIATELY;.  if
b570: 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53  ( lockType == _S
b580: 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61  HM_WRLCK ) dwFla
b590: 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45  gs |= LOCKFILE_E
b5a0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a  XCLUSIVE_LOCK;..
b5b0: 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
b5c0: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
b5d0: 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70 2e 4f  PPED));.  ovlp.O
b5e0: 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a 0a 20  ffset = ofst;.. 
b5f0: 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
b600: 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
b610: 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
b620: 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
b630: 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
b640: 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  c = UnlockFileEx
b650: 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  (pFile->hFile.h,
b660: 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f   0, nByte, 0, &o
b670: 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
b680: 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69 6c 65     rc = LockFile
b690: 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  Ex(pFile->hFile.
b6a0: 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c 20 6e  h, dwFlags, 0, n
b6b0: 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70 29 3b  Byte, 0, &ovlp);
b6c0: 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
b6d0: 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  != 0 ){.    rc =
b6e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
b6f0: 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
b700: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 47 65 74  lastErrno =  Get
b710: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
b720: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
b730: 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  Y;.  }..  OSTRAC
b740: 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20  E(("SHM-LOCK %d 
b750: 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22  %s %s 0x%08lx\n"
b760: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  , .           pF
b770: 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ile->hFile.h,.  
b780: 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
b790: 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
b7a0: 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20  "failed",.      
b7b0: 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f       lockType==_
b7c0: 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c  SHM_UNLCK ? "Unl
b7d0: 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f  ockFileEx" : "Lo
b7e0: 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20  ckFileEx",.     
b7f0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
b800: 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74  tErrno));..  ret
b810: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
b820: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
b830: 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
b840: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
b850: 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
b860: 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
b870: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
b880: 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
b890: 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
b8a0: 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
b8b0: 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
b8c0: 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
b8d0: 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
b8e0: 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
b8f0: 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
b900: 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
b910: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
b920: 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
b930: 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
b940: 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
b950: 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
b960: 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
b970: 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
b980: 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
b990: 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
b9a0: 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
b9b0: 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
b9c0: 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
b9d0: 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f  ShmNode *p;.  BO
b9e0: 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74  OL bRc;.  assert
b9f0: 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
ba00: 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77  d() );.  pp = &w
ba10: 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
ba20: 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70   while( (p = *pp
ba30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
ba40: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
ba50: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ba60: 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20   if( p->mutex ) 
ba70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
ba80: 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
ba90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
baa0: 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
bab0: 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 55  .        bRc = U
bac0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
bad0: 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
bae0: 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
baf0: 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
bb00: 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67  pid-%d unmap reg
bb10: 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
bb30: 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50 72  int)GetCurrentPr
bb40: 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20  ocessId(), i,.  
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
bb60: 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
bb70: 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
bb80: 62 52 63 20 3d 20 43 6c 6f 73 65 48 61 6e 64 6c  bRc = CloseHandl
bb90: 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
bba0: 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
bbb0: 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
bbc0: 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65 20  GE pid-%d close 
bbd0: 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
bbe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bbf0: 20 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e    (int)GetCurren
bc00: 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
bc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bc20: 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22    bRc ? "ok" : "
bc30: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
bc40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
bc50: 68 46 69 6c 65 2e 68 20 21 3d 20 49 4e 56 41 4c  hFile.h != INVAL
bc60: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
bc70: 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
bc80: 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
bc90: 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
bca0: 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
bcb0: 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
bcc0: 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
bcd0: 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
bce0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
bcf0: 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
bd00: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
bd10: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
bd20: 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
bd30: 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
bd40: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
bd50: 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
bd60: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
bd70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bd80: 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
bd90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
bda0: 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a  ee(p->aRegion);.
bdb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
bdc0: 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(p);.    }else
bdd0: 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d  {.      pp = &p-
bde0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
bdf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
be00: 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
be10: 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
be20: 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
be30: 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a  file pDbFd..**.*
be40: 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
be50: 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
be60: 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
be70: 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
be80: 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
be90: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
bea0: 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
beb0: 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
bec0: 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
bed0: 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
bee0: 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
bef0: 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
bf00: 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
bf10: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
bf20: 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61  c int winOpenSha
bf30: 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c  redMemory(winFil
bf40: 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
bf50: 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  uct winShm *p;  
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf70: 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
bf80: 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
bf90: 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
bfa0: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
bfb0: 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  = 0;   /* The un
bfc0: 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
bfd0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
bfe0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c000: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
c010: 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
c020: 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  ode *pNew;      
c030: 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
c040: 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f  located winShmNo
c050: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  de */.  int nNam
c060: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
c080: 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62  ze of zName in b
c090: 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ytes */..  asser
c0a0: 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
c0b0: 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70  0 );    /* Not p
c0c0: 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
c0d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
c0e0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
c0f0: 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
c100: 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73   object.  Also s
c110: 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a  peculatively.  *
c120: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
c130: 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68   for a new winSh
c140: 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61  mNode and filena
c150: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  me..  */.  p = s
c160: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
c170: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
c180: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
c190: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c1a0: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
c1b0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61  zeof(*p));.  nNa
c1c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
c1d0: 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74  en30(pDbFd->zPat
c1e0: 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  h);.  pNew = sql
c1f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
c200: 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
c210: 20 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20   nName + 15 );. 
c220: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
c230: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c240: 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
c250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c260: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
c270: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
c280: 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c  ));.  pNew->zFil
c290: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
c2a0: 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74  pNew[1];.  sqlit
c2b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d  e3_snprintf(nNam
c2c0: 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  e+15, pNew->zFil
c2d0: 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
c2e0: 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
c2f0: 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
c300: 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
c310: 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  h, pNew->zFilena
c320: 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  me); ..  /* Look
c330: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
c340: 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
c350: 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
c360: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
c370: 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
c380: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
c390: 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
c3a0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
c3b0: 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
c3c0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
c3d0: 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
c3e0: 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
c3f0: 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
c400: 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
c410: 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
c420: 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
c430: 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
c440: 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
c450: 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
c460: 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
c470: 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
c480: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
c490: 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
c4a0: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
c4b0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
c4c0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
c4d0: 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
c4e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c4f0: 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
c500: 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
c510: 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
c520: 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
c530: 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
c540: 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
c550: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
c560: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
c570: 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
c580: 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
c590: 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
c5a0: 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e  Node;..    pShmN
c5b0: 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
c5c0: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
c5d0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
c5e0: 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
c5f0: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
c600: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c610: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c620: 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
c630: 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
c640: 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  rc = winOpen(pDb
c650: 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
c660: 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
c670: 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
c680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c690: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
c6a0: 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20  (UTF-8) */.     
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
c6c0: 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
c6d0: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a  Node->hFile,  /*
c6e0: 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   File handle her
c6f0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
c700: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
c710: 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f  N_WAL | SQLITE_O
c720: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
c730: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
c740: 54 45 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67  TE, /* Mode flag
c750: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  s */.           
c760: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
c770: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
c780: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
c790: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
c7a0: 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  PT;.      goto s
c7b0: 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
c7c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
c7d0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
c7e0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
c7f0: 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
c800: 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a  an switch..    *
c810: 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
c820: 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
c830: 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
c840: 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
c850: 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
c860: 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
c870: 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
c880: 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
c890: 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
c8a0: 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
c8b0: 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
c8c0: 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
c8d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c8e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c8f0: 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
c900: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
c910: 48 4d 4f 50 45 4e 2c 20 22 77 69 6e 4f 70 65 6e  HMOPEN, "winOpen
c920: 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  Shm", pDbFd->zPa
c930: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
c940: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
c950: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c960: 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
c970: 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
c980: 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
c990: 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
c9a0: 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
c9b0: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
c9c0: 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  _SHM_RDLCK, WIN_
c9d0: 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
c9e0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
c9f0: 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
ca00: 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
ca10: 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
ca20: 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
ca30: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
ca40: 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
ca50: 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
ca60: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ca70: 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
ca80: 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
ca90: 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
caa0: 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
cab0: 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
cac0: 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
cad0: 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
cae0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
caf0: 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
cb00: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
cb10: 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
cb20: 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
cb30: 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
cb40: 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
cb50: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
cb60: 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
cb70: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
cb80: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
cb90: 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
cba0: 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
cbb0: 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
cbc0: 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
cbd0: 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
cbe0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
cbf0: 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
cc00: 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
cc10: 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
cc20: 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
cc30: 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
cc40: 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
cc50: 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
cc60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
cc70: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
cc80: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
cc90: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
cca0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
ccb0: 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
ccc0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
ccd0: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
cce0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ccf0: 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
cd00: 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
cd10: 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
cd20: 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
cd30: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
cd40: 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
cd50: 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e  M_DMS, 1);.  win
cd60: 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
cd70: 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f  pVfs, 0);      /
cd80: 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
cd90: 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
cda0: 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
cdb0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
cdc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
cdd0: 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
cde0: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
cdf0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
ce00: 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
ce10: 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
ce20: 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
ce30: 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
ce40: 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
ce50: 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
ce60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
ce70: 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
ce80: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
ce90: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
cea0: 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
ceb0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
cec0: 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
ced0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
cee0: 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
cef0: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
cf00: 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
cf10: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
cf20: 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
cf30: 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
cf40: 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
cf50: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
cf60: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
cf70: 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
cf80: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
cf90: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
cfa0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
cfb0: 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
cfc0: 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
cfd0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
cfe0: 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
cff0: 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
d000: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
d010: 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
d020: 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
d030: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d040: 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
d050: 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
d060: 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
d070: 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
d080: 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
d090: 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
d0a0: 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
d0b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
d0c0: 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
d0d0: 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
d0e0: 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
d0f0: 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
d100: 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
d110: 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
d120: 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
d130: 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
d140: 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
d150: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
d160: 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
d170: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d180: 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
d190: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
d1a0: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
d1b0: 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
d1c0: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
d1d0: 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
d1e0: 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
d1f0: 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
d200: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
d210: 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
d220: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
d230: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
d240: 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
d250: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
d260: 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
d270: 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
d280: 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
d290: 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
d2a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d2b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
d2c0: 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
d2d0: 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
d2e0: 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
d2f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
d300: 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
d310: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
d320: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
d330: 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
d340: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
d350: 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
d380: 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
d390: 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
d3a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d3b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d3c0: 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
d3d0: 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
d3e0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d400: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
d410: 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
d420: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
d430: 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
d440: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
d450: 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
d460: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
d470: 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
d480: 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
d490: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
d4a0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
d4b0: 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
d4c0: 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
d4f0: 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
d500: 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
d510: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
d520: 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
d530: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d540: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
d550: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
d560: 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
d570: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
d5a0: 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
d5b0: 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
d5c0: 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
d5d0: 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
d5e0: 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
d5f0: 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
d600: 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
d610: 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
d620: 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
d630: 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
d640: 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
d650: 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
d660: 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
d670: 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
d680: 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
d690: 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
d6a0: 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
d6b0: 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
d6c0: 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
d6d0: 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
d6e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
d6f0: 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
d700: 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
d710: 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
d720: 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
d730: 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
d740: 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
d750: 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
d760: 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
d770: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d780: 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
d790: 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
d7a0: 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
d7b0: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
d7c0: 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
d7d0: 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
d7e0: 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
d7f0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
d800: 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
d810: 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
d820: 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
d830: 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
d840: 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
d850: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
d860: 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
d870: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d880: 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
d890: 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
d8a0: 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
d8b0: 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
d8c0: 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
d8d0: 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
d8e0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
d8f0: 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
d900: 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
d910: 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
d920: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
d930: 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
d940: 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
d950: 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
d960: 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
d970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
d980: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d990: 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
d9a0: 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
d9b0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
d9c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d9d0: 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
d9e0: 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
d9f0: 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
da00: 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
da10: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
da20: 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
da30: 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
da40: 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
da50: 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
da60: 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
da70: 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
da80: 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
da90: 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
daa0: 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
dab0: 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
dac0: 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
dad0: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
dae0: 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
daf0: 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
db00: 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
db10: 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
db20: 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
db30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
db40: 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
db50: 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
db60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
db70: 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
db80: 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
db90: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
dba0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
dbb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
dbc0: 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
dbd0: 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
dbe0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
dbf0: 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
dc00: 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
dc10: 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
dc20: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
dc30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
dc40: 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
dc50: 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
dc60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
dc70: 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
dc80: 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
dc90: 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
dca0: 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
dcb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dcc0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
dcd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dce0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
dcf0: 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
dd00: 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
dd10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
dd20: 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
dd30: 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
dd40: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
dd50: 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
dd60: 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
dd70: 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
dd80: 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
dd90: 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
dda0: 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
ddb0: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
ddc0: 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
ddd0: 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
dde0: 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
ddf0: 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
de00: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
de10: 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
de20: 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
de30: 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
de40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
de50: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
de60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
de70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
de80: 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
de90: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
dea0: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
deb0: 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
dec0: 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
ded0: 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
dee0: 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
def0: 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
df00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
df10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
df20: 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
df30: 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
df40: 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
df50: 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
df60: 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
df70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
df90: 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
dfa0: 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
dfb0: 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
dfc0: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
dfd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
dfe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
dff0: 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
e000: 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
e010: 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
e020: 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
e030: 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22   %03x,%03x %s\n"
e040: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
e050: 69 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72 72  id, (int)GetCurr
e060: 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
e070: 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
e080: 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20  ->exclMask,.    
e090: 20 20 20 20 20 20 20 72 63 20 3f 20 22 66 61 69         rc ? "fai
e0a0: 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20  led" : "ok"));. 
e0b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e0c0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
e0d0: 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
e0e0: 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
e0f0: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
e100: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
e110: 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
e120: 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
e130: 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
e140: 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
e150: 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
e160: 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
e170: 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
e180: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
e190: 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
e1a0: 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
e1b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
e1c0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
e1d0: 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
e1e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e1f0: 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65  TER(fd);.  /* Me
e200: 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f  moryBarrier(); /
e210: 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  / does not work 
e220: 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77  -- do not know w
e230: 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53  hy not */.  winS
e240: 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
e250: 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
e260: 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ex();.}../*.** T
e270: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e280: 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
e290: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
e2a0: 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
e2b0: 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
e2c0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
e2d0: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
e2e0: 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
e2f0: 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
e300: 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
e310: 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
e320: 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
e330: 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
e340: 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
e350: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
e360: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
e370: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
e380: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
e390: 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
e3a0: 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
e3b0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
e3c0: 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61  the isWrite para
e3d0: 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
e3e0: 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
e3f0: 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
e400: 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
e410: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
e420: 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
e430: 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
e440: 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
e450: 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
e460: 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
e470: 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
e480: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
e490: 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e  .** isWrite is n
e4a0: 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
e4b0: 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
e4c0: 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
e4d0: 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
e4e0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
e4f0: 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
e500: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
e510: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
e520: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
e530: 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
e540: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
e550: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
e560: 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
e570: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
e580: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
e590: 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
e5a0: 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
e5b0: 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
e5c0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
e5d0: 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
e5e0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
e5f0: 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
e600: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
e610: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
e620: 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a   int winShmMap(.
e630: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
e640: 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
e650: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
e660: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
e670: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
e680: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
e690: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
e6a0: 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
e6b0: 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
e6e0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ions */.  int is
e6f0: 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
e700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
e710: 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
e720: 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
e730: 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
e740: 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
e750: 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
e760: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
e770: 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
e780: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a  = (winFile*)fd;.
e790: 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
e7a0: 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e  bFd->pShm;.  win
e7b0: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
e7c0: 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
e7d0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
e7e0: 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  !p ){.    rc = w
e7f0: 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
e800: 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
e810: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e820: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e830: 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
e840: 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64  m;.  }.  pShmNod
e850: 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
e860: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
e870: 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
e880: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
e890: 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
e8a0: 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
e8b0: 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
e8c0: 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69  egion==0 );..  i
e8d0: 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
e8e0: 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
e8f0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52  .    struct ShmR
e900: 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20  egion *apNew;   
e910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
e920: 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
e930: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
e940: 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
e950: 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
e960: 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
e970: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  e size */.    sq
e980: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20  lite3_int64 sz; 
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
e9b0: 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69   of wal-index fi
e9c0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  le */..    pShmN
e9d0: 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
e9e0: 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f  szRegion;..    /
e9f0: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
ea00: 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
ea10: 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
ea20: 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
ea30: 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43   space..    ** C
ea40: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
ea50: 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
ea60: 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
ea70: 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
ea80: 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65   is.    ** large
ea90: 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
eaa0: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
eab0: 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f   region)..    */
eac0: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
ead0: 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
eae0: 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
eaf0: 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20  >hFile, &sz);.  
eb00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
eb10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
eb20: 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
eb30: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
eb40: 5a 45 2c 20 22 77 69 6e 53 68 6d 4d 61 70 31 22  ZE, "winShmMap1"
eb50: 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
eb60: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70  .      goto shmp
eb70: 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
eb80: 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65      if( sz<nByte
eb90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
eba0: 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
ebb0: 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
ebc0: 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72  t exist. If isWr
ebd0: 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20  ite is set to.  
ebe0: 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69      ** zero, exi
ebf0: 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
ec00: 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
ec10: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
ec20: 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a  eturned..      *
ec30: 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72  *.      ** Alter
ec40: 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57  natively, if isW
ec50: 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
ec60: 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28  , use ftruncate(
ec70: 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ) to allocate.  
ec80: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
ec90: 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
eca0: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
ecb0: 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20     if( !isWrite 
ecc0: 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f  ) goto shmpage_o
ecd0: 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ut;.      rc = w
ece0: 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
ecf0: 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
ed00: 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79  Node->hFile, nBy
ed10: 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  te);.      if( r
ed20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ed30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
ed40: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
ed50: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22  IOERR_SHMSIZE, "
ed60: 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62  winShmMap2", pDb
ed70: 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
ed80: 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
ed90: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
eda0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
edb0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
edc0: 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
edd0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
ede0: 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
edf0: 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73  /.    apNew = (s
ee00: 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
ee10: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
ee20: 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
ee30: 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
ee40: 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
ee50: 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
ee60: 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
ee70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
ee80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
ee90: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
eea0: 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
eeb0: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
eec0: 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
eed0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
eee0: 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
eef0: 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
ef00: 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
ef20: 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
ef30: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
ef40: 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
ef50: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
ef60: 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
ef70: 2a 2f 0a 20 20 20 20 20 0a 20 20 20 20 20 20 68  */.     .      h
ef80: 4d 61 70 20 3d 20 43 72 65 61 74 65 46 69 6c 65  Map = CreateFile
ef90: 4d 61 70 70 69 6e 67 28 70 53 68 6d 4e 6f 64 65  Mapping(pShmNode
efa0: 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20  ->hFile.h, .    
efb0: 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
efc0: 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e  _READWRITE, 0, n
efd0: 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20  Byte, NULL.     
efe0: 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
eff0: 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d  E(("SHM-MAP pid-
f000: 25 64 20 63 72 65 61 74 65 20 72 65 67 69 6f 6e  %d create region
f010: 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25 73 5c  =%d nbyte=%d %s\
f020: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
f030: 20 20 20 28 69 6e 74 29 47 65 74 43 75 72 72 65     (int)GetCurre
f040: 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
f050: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
f060: 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
f070: 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22          hMap ? "
f080: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
f090: 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70  ;.      if( hMap
f0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
f0b0: 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f  iOffset = pShmNo
f0c0: 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
f0d0: 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e  gion;.        in
f0e0: 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
f0f0: 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
f100: 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
f110: 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20  onGranularity;. 
f120: 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 4d 61         pMap = Ma
f130: 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70  pViewOfFile(hMap
f140: 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
f150: 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
f160: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
f170: 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
f180: 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
f190: 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
f1a0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
f1b0: 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
f1c0: 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d 61 70  M-MAP pid-%d map
f1d0: 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65   region=%d offse
f1e0: 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25 73 5c  t=%d size=%d %s\
f1f0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
f200: 20 20 20 20 20 28 69 6e 74 29 47 65 74 43 75 72       (int)GetCur
f210: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
f220: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
f230: 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 20 73 7a 52  on, iOffset, szR
f240: 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  egion,.         
f250: 20 20 20 20 20 20 20 20 70 4d 61 70 20 3f 20 22          pMap ? "
f260: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
f270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f280: 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
f290: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
f2a0: 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61  astErrno = GetLa
f2b0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
f2c0: 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
f2d0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f2e0: 5f 53 48 4d 4d 41 50 2c 20 22 77 69 6e 53 68 6d  _SHMMAP, "winShm
f2f0: 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
f300: 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
f310: 28 20 68 4d 61 70 20 29 20 43 6c 6f 73 65 48 61  ( hMap ) CloseHa
f320: 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20  ndle(hMap);.    
f330: 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
f340: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
f350: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
f360: 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
f370: 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d  >nRegion].pMap =
f380: 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   pMap;.      pSh
f390: 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
f3a0: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
f3b0: 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20  ].hMap = hMap;. 
f3c0: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
f3d0: 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
f3e0: 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
f3f0: 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
f400: 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
f410: 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  n ){.    int iOf
f420: 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73  fset = iRegion*s
f430: 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  zRegion;.    int
f440: 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
f450: 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
f460: 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
f470: 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20  nGranularity;.  
f480: 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
f490: 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52  r *)pShmNode->aR
f4a0: 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70  egion[iRegion].p
f4b0: 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  Map;.    *pp = (
f4c0: 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65  void *)&p[iOffse
f4d0: 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65  tShift];.  }else
f4e0: 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
f4f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f500: 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
f510: 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
f520: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
f530: 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
f540: 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
f550: 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20  ne winShmLock   
f560: 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
f570: 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
f580: 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70  fine winShmUnmap
f590: 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
f5a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f5b0: 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
f5c0: 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
f5d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
f5e0: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
f5f0: 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
f600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f610: 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
f620: 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
f630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
f6a0: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
f6b0: 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
f6c0: 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
f6d0: 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a  n operate on an.
f6e0: 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
f6f0: 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74  for win32..*/.st
f700: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
f710: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69  e3_io_methods wi
f720: 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  nIoMethod = {.  
f730: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
f760: 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20   winClose,      
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
f790: 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20  winRead,        
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69  /* xRead */.  wi
f7c0: 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  nWrite,         
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f7e0: 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e   xWrite */.  win
f7f0: 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f810: 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77  xTruncate */.  w
f820: 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  inSync,         
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f840: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e  * xSync */.  win
f850: 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f870: 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77  xFileSize */.  w
f880: 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  inLock,         
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f8a0: 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  * xLock */.  win
f8b0: 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8d0: 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  xUnlock */.  win
f8e0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
f8f0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
f900: 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
f910: 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43  ck */.  winFileC
f920: 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
f930: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
f940: 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e  Control */.  win
f950: 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f970: 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
f980: 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
f990: 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
f9a0: 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
f9b0: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
f9c0: 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  winShmMap,      
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
f9f0: 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  winShmLock,     
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
fa20: 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20   winShmBarrier, 
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
fa50: 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70  */.  winShmUnmap
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
fa80: 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  p */.};../******
fa90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
faa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fad0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
fae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
faf0: 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
fb00: 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
fb10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb20: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
fb30: 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
fb40: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
fb50: 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
fb60: 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
fb70: 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
fb80: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
fb90: 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65  a UTF-8 filename
fba0: 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
fbb0: 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  orm the underlyi
fbc0: 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  ng.** operating 
fbd0: 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c  system wants fil
fbe0: 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63  enames in.  Spac
fbf0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
fc00: 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69  sult.** is obtai
fc10: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
fc20: 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
fc30: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
fc40: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
fc50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f  .static void *co
fc60: 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
fc70: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
fc80: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
fc90: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
fca0: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
fcb0: 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
fcc0: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
fcd0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 2f 2a 20  (zFilename);./* 
fce0: 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
fcf0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
fd00: 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
fd10: 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
fd20: 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  d. .*/.#if SQLIT
fd30: 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
fd40: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76  }else{.    zConv
fd50: 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
fd60: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
fd70: 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  cs(zFilename);.#
fd80: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 2f 2a 20 63  endif.  }.  /* c
fd90: 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
fda0: 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
fdb0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
fdc0: 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  verted;.}../*.**
fdd0: 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
fde0: 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
fdf0: 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
fe00: 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
fe10: 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56  to.** hold at pV
fe20: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63  fs->mxPathname c
fe30: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74  haracters..*/.st
fe40: 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70  atic int getTemp
fe50: 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
fe60: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
fe70: 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73  atic char zChars
fe80: 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
fe90: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
fea0: 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
feb0: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
fec0: 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
fed0: 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f  456789";.  size_
fee0: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
fef0: 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54  TempPath[MAX_PAT
ff00: 48 2b 31 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  H+1];..  /* It's
ff10: 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
ff20: 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
ff30: 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
ff40: 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
ff50: 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
ff60: 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
ff70: 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
ff80: 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
ff90: 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
ffa0: 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
ffb0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
ffc0: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
ffd0: 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 69 66 28  _IOERR );..  if(
ffe0: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
fff0: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
10000 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
10010 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65  MAX_PATH-30, zTe
10020 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71  mpPath, "%s", sq
10030 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
10040 74 6f 72 79 29 3b 0a 20 20 7d 65 6c 73 65 20 69  tory);.  }else i
10050 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
10060 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
10070 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61     WCHAR zWidePa
10080 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
10090 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d    GetTempPathW(M
100a0 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64  AX_PATH-30, zWid
100b0 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c  ePath);.    zMul
100c0 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ti = unicodeToUt
100d0 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
100e0 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
100f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
10100 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
10110 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
10120 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20  "%s", zMulti);. 
10130 20 20 20 20 20 66 72 65 65 28 7a 4d 75 6c 74 69       free(zMulti
10140 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10160 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 2f  E_NOMEM;.    }./
10170 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
10180 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10190 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
101a0 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
101b0 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74  ted. .** Since t
101c0 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e  he ASCII version
101d0 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77   of these Window
101e0 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69  s API do not exi
101f0 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a  st for WINCE,.**
10200 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20   it's important 
10210 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65  to not reference
10220 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20   them for WINCE 
10230 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53  builds..*/.#if S
10240 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
10250 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  0.  }else{.    c
10260 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
10270 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d  char zMbcsPath[M
10280 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 47 65  AX_PATH];.    Ge
10290 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50  tTempPathA(MAX_P
102a0 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74  ATH-30, zMbcsPat
102b0 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20  h);.    zUtf8 = 
102c0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
102d0 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73  cs_to_utf8(zMbcs
102e0 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
102f0 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71  Utf8 ){.      sq
10300 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
10310 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
10320 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74  pPath, "%s", zUt
10330 66 38 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  f8);.      free(
10340 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
10350 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
10360 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10370 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
10380 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
10390 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
103a0 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
103b0 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
103c0 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
103d0 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ame. If it is no
103e0 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
103f0 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69  _ERROR..  */.  i
10400 66 28 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  f( (sqlite3Strle
10410 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 20 2b  n30(zTempPath) +
10420 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
10430 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
10440 45 5f 50 52 45 46 49 58 29 20 2b 20 31 37 29 20  E_PREFIX) + 17) 
10450 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  >= nBuf ){.    r
10460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10470 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  OR;.  }..  for(i
10480 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
10490 28 7a 54 65 6d 70 50 61 74 68 29 3b 20 69 3e 30  (zTempPath); i>0
104a0 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d   && zTempPath[i-
104b0 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d  1]=='\\'; i--){}
104c0 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20  .  zTempPath[i] 
104d0 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
104e0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 37  snprintf(nBuf-17
104f0 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
10500 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c             "%s\\
10510 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
10520 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50  E_PREFIX, zTempP
10530 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69  ath);.  j = sqli
10540 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
10550 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
10560 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
10570 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
10580 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
10590 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
105a0 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
105b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
105c0 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
105d0 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
105e0 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
105f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ..  OSTRACE(("TE
10600 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c  MP FILENAME: %s\
10610 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65  n", zBuf));.  re
10620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
10630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
10640 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10650 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20   int winOpen(.  
10660 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
10670 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  s,        /* Not
10680 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
10690 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
106a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
106b0 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
106c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
106d0 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
106e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
106f0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
10700 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
10710 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
10720 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65      /* Open mode
10730 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
10740 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
10750 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
10760 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a  return flags */.
10770 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
10780 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
10790 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
107a0 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
107b0 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
107c0 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
107d0 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
107e0 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
107f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10800 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
10810 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
10820 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
10830 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f  inFile*)id;.  vo
10840 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20  id *zConverted; 
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10860 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65  Filename in OS e
10870 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  ncoding */.  con
10880 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61  st char *zUtf8Na
10890 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46  me = zName; /* F
108a0 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
108b0 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
108c0 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
108d0 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
108e0 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
108f0 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
10900 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
10910 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
10920 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
10930 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
10940 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
10950 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
10960 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 20 20  [MAX_PATH+1];   
10970 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
10980 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20   to create temp 
10990 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69  filename */..  i
109a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
109b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
109c0 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
109d0 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65   Code */.#if !de
109e0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
109f0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10a00 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
10a10 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
10a20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
10a30 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
10a40 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  dif..  int isExc
10a50 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
10a60 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
10a70 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
10a80 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
10a90 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
10aa0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
10ab0 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
10ac0 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
10ad0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
10ae0 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65 66 20  REATE);.#ifndef 
10af0 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 52  NDEBUG.  int isR
10b00 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
10b10 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
10b20 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e 64  _READONLY);.#end
10b30 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  if.  int isReadW
10b40 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
10b50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
10b60 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65  DWRITE);..#ifnde
10b70 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
10b80 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  sOpenJournal = (
10b90 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
10ba0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
10bb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
10bc0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
10bd0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
10be0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
10bf0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
10c00 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
10c10 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
10c20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
10c30 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
10c40 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
10c50 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
10c60 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
10c70 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
10c80 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
10c90 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
10ca0 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
10cb0 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
10cc0 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
10cd0 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
10ce0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
10cf0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
10d00 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
10d10 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
10d20 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
10d30 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
10d40 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
10d50 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
10d60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
10d70 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
10d80 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
10d90 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
10da0 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
10db0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
10dc0 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
10dd0 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
10de0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
10df0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
10e00 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
10e10 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
10e20 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
10e30 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
10e40 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
10e50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
10e60 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
10e70 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
10e80 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
10e90 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
10ea0 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
10eb0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
10ec0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
10ed0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
10ee0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
10ef0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
10f00 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
10f10 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
10f20 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
10f30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
10f40 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
10f50 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
10f60 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
10f70 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
10f80 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
10f90 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
10fa0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
10fb0 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
10fc0 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
10fd0 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
10fe0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
10ff0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
11000 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
11010 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
11020 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
11030 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
11040 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
11050 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
11060 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
11070 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
11080 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
11090 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
110a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
110b0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
110c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
110d0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
110e0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
110f0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
11100 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
11110 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
11120 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
11130 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
11140 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
11150 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
11160 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41   pFile->h = INVA
11170 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
11180 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
11190 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
111a0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
111b0 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74  is NULL, generat
111c0 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  e a .  ** tempor
111d0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ary file name to
111e0 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28   use .  */.  if(
111f0 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
11200 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
11210 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75  te && !isOpenJou
11220 72 6e 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20  rnal);.    rc = 
11230 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
11240 50 41 54 48 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65  PATH+1, zTmpname
11250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11280 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65   }.    zUtf8Name
11290 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
112a0 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
112b0 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
112c0 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
112d0 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
112e0 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
112f0 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e  8Filename(zUtf8N
11300 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
11310 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
11320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11330 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OMEM;.  }..  if(
11340 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
11350 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
11360 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
11370 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
11380 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
11390 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
113a0 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
113b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54  .  }..  /* SQLIT
113c0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
113d0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
113e0 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77   sure that a new
113f0 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63   file is .  ** c
11400 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
11410 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
11420 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
11430 73 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20  sive access" .  
11440 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61  ** as it is usua
11450 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a  lly understood..
11460 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63    */.  if( isExc
11470 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
11480 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66   Creates a new f
11490 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
114a0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
114b0 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f   exist. */.    /
114c0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78  * If the file ex
114d0 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20  ists, it fails. 
114e0 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
114f0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43  nDisposition = C
11500 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c  REATE_NEW;.  }el
11510 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20  se if( isCreate 
11520 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65  ){.    /* Open e
11530 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72  xisting file, or
11540 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f   create if it do
11550 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20  esn't exist */. 
11560 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
11570 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
11580 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
11590 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20  .    /* Opens a 
115a0 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
115b0 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
115c0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
115d0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49  ition = OPEN_EXI
115e0 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77  STING;.  }..  dw
115f0 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45  ShareMode = FILE
11600 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
11610 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a  LE_SHARE_WRITE;.
11620 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
11630 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
11640 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61  _WINCE.    dwFla
11650 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
11660 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
11670 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54  _HIDDEN;.    isT
11680 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  emp = 1;.#else. 
11690 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
116a0 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
116b0 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
116c0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55    | FILE_ATTRIBU
116f0 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20  TE_HIDDEN.      
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11710 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
11720 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
11730 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  LOSE;.#endif.  }
11740 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67  else{.    dwFlag
11750 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
11760 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
11770 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
11780 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68   Reports from th
11790 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74  e internet are t
117a0 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  hat performance 
117b0 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62  is always.  ** b
117c0 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c  etter if FILE_FL
117d0 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
117e0 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65   is used.  Ticke
117f0 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20  t #2699. */.#if 
11800 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
11810 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
11820 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
11830 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
11840 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  S;.#endif..  if(
11850 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68   isNT() ){.    h
11860 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57 28 28   = CreateFileW((
11870 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
11880 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73 69  d,.       dwDesi
11890 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
118a0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20    dwShareMode,. 
118b0 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
118c0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
118d0 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
118e0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
118f0 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55  butes,.       NU
11900 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a 20 69 73 4e  LL.    );./* isN
11910 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
11920 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
11930 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
11940 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
11950 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53  .** Since the AS
11960 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  CII version of t
11970 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
11980 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
11990 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
119a0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
119b0 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
119c0 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
119d0 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
119e0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
119f0 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 43 72  else{.    h = Cr
11a00 65 61 74 65 46 69 6c 65 41 28 28 63 68 61 72 2a  eateFileA((char*
11a10 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
11a20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
11a30 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77 53 68  ess,.       dwSh
11a40 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20  areMode,.       
11a50 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64 77 43  NULL,.       dwC
11a60 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
11a70 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46 6c 61  on,.       dwFla
11a80 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
11a90 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20  .       NULL.   
11aa0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a   );.#endif.  }..
11ab0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
11ac0 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c   %d %s 0x%lx %s\
11ad0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
11ae0 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69  h, zName, dwDesi
11af0 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20  redAccess, .    
11b00 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49         h==INVALI
11b10 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f  D_HANDLE_VALUE ?
11b20 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
11b30 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
11b40 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
11b50 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  UE ){.    pFile-
11b60 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
11b70 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
11b80 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11b90 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 22 77  ITE_CANTOPEN, "w
11ba0 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61  inOpen", zUtf8Na
11bb0 6d 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43  me);.    free(zC
11bc0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69  onverted);.    i
11bd0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
11be0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
11bf0 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
11c00 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
11c10 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
11c20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
11c30 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50 45  LY)&~(SQLITE_OPE
11c40 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
11c50 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29  OPEN_READWRITE))
11c60 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
11c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
11c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
11c90 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
11ca0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
11cb0 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
11cc0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
11cd0 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
11ce0 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
11cf0 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
11d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
11d10 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
11d20 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
11d30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73     }.  }..  mems
11d40 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
11d50 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20  eof(*pFile));.  
11d60 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d  pFile->pMethod =
11d70 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20   &winIoMethod;. 
11d80 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
11d90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11da0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20  o = NO_ERROR;.  
11db0 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56  pFile->pVfs = pV
11dc0 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68  fs;.  pFile->pSh
11dd0 6d 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  m = 0;.  pFile->
11de0 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zPath = zName;. 
11df0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
11e00 7a 65 20 3d 20 67 65 74 53 65 63 74 6f 72 53 69  ze = getSectorSi
11e10 7a 65 28 70 56 66 73 2c 20 7a 55 74 66 38 4e 61  ze(pVfs, zUtf8Na
11e20 6d 65 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  me);..#if SQLITE
11e30 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
11e40 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65  isReadWrite && e
11e50 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
11e60 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20  N_MAIN_DB.      
11e70 20 26 26 20 21 77 69 6e 63 65 43 72 65 61 74 65   && !winceCreate
11e80 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c  Lock(zName, pFil
11e90 65 29 0a 20 20 29 7b 0a 20 20 20 20 43 6c 6f 73  e).  ){.    Clos
11ea0 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20  eHandle(h);.    
11eb0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
11ec0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11ed0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
11ee0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  T;.  }.  if( isT
11ef0 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
11f00 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
11f10 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
11f20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
11f30 7b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  {.    free(zConv
11f40 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f  erted);.  }..  O
11f50 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
11f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11f70 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
11f80 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
11f90 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 69 6e  ** Note that win
11fa0 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
11fb0 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
11fc0 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
11fd0 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
11fe0 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
11ff0 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
12000 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
12010 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
12020 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
12030 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
12040 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
12050 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
12060 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
12070 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
12080 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
12090 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
120a0 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
120b0 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
120c0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
120d0 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
120e0 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
120f0 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
12100 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
12110 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
12120 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
12130 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
12140 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
12150 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
12160 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
12170 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
12180 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
12190 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
121a0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
121b0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
121c0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
121d0 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
121e0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
121f0 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
12200 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
12210 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
12220 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
12230 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
12240 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
12250 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
12260 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  t rc;.  void *zC
12270 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
12280 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
12290 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
122a0 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b  AMETER(syncDir);
122b0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
122c0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
122d0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
122e0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
122f0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
12300 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
12310 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
12320 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12330 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12340 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
12350 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
12360 20 20 20 20 77 68 69 6c 65 28 20 47 65 74 46 69      while( GetFi
12370 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
12380 6f 6e 76 65 72 74 65 64 29 21 3d 49 4e 56 41 4c  onverted)!=INVAL
12390 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
123a0 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ES &&.          
123b0 20 28 72 63 20 3d 20 44 65 6c 65 74 65 46 69 6c   (rc = DeleteFil
123c0 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 3d  eW(zConverted))=
123d0 3d 30 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  =0 && retryIoerr
123e0 28 26 63 6e 74 29 20 29 7b 7d 0a 20 20 20 20 72  (&cnt) ){}.    r
123f0 63 20 3d 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  c = rc ? SQLITE_
12400 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  OK : SQLITE_ERRO
12410 52 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  R;./* isNT() is 
12420 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
12430 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
12440 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
12450 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
12460 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
12470 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
12480 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
12490 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
124a0 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
124b0 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
124c0 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
124d0 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
124e0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
124f0 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
12500 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 77     rc = 1;.    w
12510 68 69 6c 65 28 20 47 65 74 46 69 6c 65 41 74 74  hile( GetFileAtt
12520 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
12530 74 65 64 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49  ted)!=INVALID_FI
12540 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
12550 0a 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20  .           (rc 
12560 3d 20 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43  = DeleteFileA(zC
12570 6f 6e 76 65 72 74 65 64 29 29 3d 3d 30 20 26 26  onverted))==0 &&
12580 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
12590 29 20 29 7b 7d 0a 20 20 20 20 72 63 20 3d 20 72  ) ){}.    rc = r
125a0 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  c ? SQLITE_OK : 
125b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 65  SQLITE_ERROR;.#e
125c0 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 72  ndif.  }.  if( r
125d0 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  c ){.    rc = wi
125e0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
125f0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22  _IOERR_DELETE, "
12600 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
12610 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
12620 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  .    logIoerr(cn
12630 74 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a  t);.  }.  free(z
12640 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53  Converted);.  OS
12650 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c  TRACE(("DELETE \
12660 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69  "%s\" %s\n", zFi
12670 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f 20 22 66  lename, (rc ? "f
12680 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 20 29 29  ailed" : "ok" ))
12690 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
126a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
126b0 68 65 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64  he existance and
126c0 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
126d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
126e0 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
126f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
12710 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
12720 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12730 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
12740 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
12750 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
12760 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12770 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
12780 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
12790 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
127a0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
127b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
127c0 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b  UT: Result */.){
127d0 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
127e0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 76   int rc = 0;.  v
127f0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
12800 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
12810 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69  TER(pVfs);..  Si
12820 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12840 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
12850 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
12860 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
12870 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
12880 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
12890 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
128a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
128b0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
128c0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
128d0 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
128e0 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
128f0 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
12900 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
12910 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
12920 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
12930 6c 65 28 20 21 28 72 63 20 3d 20 47 65 74 46 69  le( !(rc = GetFi
12940 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
12950 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
12960 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
12990 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20  andard, .       
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129b0 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
129c0 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72  )) && retryIoerr
129d0 28 26 63 6e 74 29 20 29 7b 7d 0a 20 20 20 20 69  (&cnt) ){}.    i
129e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
129f0 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f  * For an SQLITE_
12a00 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75  ACCESS_EXISTS qu
12a10 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72  ery, treat a zer
12a20 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20  o-length file.  
12a30 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
12a40 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
12a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
12a60 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c  f(    flags==SQL
12a70 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
12a80 53 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  S.          && s
12a90 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
12aa0 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20  zeHigh==0 .     
12ab0 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74       && sAttrDat
12ac0 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d  a.nFileSizeLow==
12ad0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  0 ){.        att
12ae0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
12af0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
12b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b10 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61    attr = sAttrDa
12b20 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
12b30 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  tes;.      }.   
12b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
12b50 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20  gIoerr(cnt);.   
12b60 20 20 20 69 66 28 20 47 65 74 4c 61 73 74 45 72     if( GetLastEr
12b70 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 46 49 4c  ror()!=ERROR_FIL
12b80 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  E_NOT_FOUND ){. 
12b90 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72         winLogErr
12ba0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12bb0 41 43 43 45 53 53 2c 20 22 77 69 6e 41 63 63 65  ACCESS, "winAcce
12bc0 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  ss", zFilename);
12bd0 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 43  .        free(zC
12be0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
12bf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12c00 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
12c10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12c20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
12c30 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
12c40 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
12c50 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31  }./* isNT() is 1
12c60 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   if SQLITE_OS_WI
12c70 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20  NCE==1, so this 
12c80 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78  else is never ex
12c90 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63  ecuted. .** Sinc
12ca0 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73  e the ASCII vers
12cb0 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e  ion of these Win
12cc0 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20  dows API do not 
12cd0 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c  exist for WINCE,
12ce0 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61  .** it's importa
12cf0 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65  nt to not refere
12d00 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e  nce them for WIN
12d10 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  CE builds..*/.#i
12d20 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12d30 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
12d40 20 20 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65    attr = GetFile
12d50 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
12d60 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
12d70 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
12d80 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
12d90 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
12da0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
12db0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
12dc0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
12dd0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
12de0 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
12df0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
12e00 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72  IBUTES;.      br
12e10 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
12e20 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
12e30 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20  WRITE:.      rc 
12e40 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
12e50 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
12e60 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
12e70 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  (attr & FILE_ATT
12e80 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29  RIBUTE_READONLY)
12e90 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ==0;.      break
12ea0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
12eb0 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
12ec0 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
12ed0 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
12ee0 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72  ResOut = rc;.  r
12ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12f00 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  .}.../*.** Turn 
12f10 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
12f20 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
12f30 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
12f40 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
12f50 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
12f60 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
12f70 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
12f80 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
12f90 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
12fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12fb0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
12fc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12fd0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
12fe0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
12ff0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
13000 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
13010 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
13020 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
13030 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
13040 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13060 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
13070 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
13080 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
130b0 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20  er */.){.  .#if 
130c0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
130d0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
130e0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
130f0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
13100 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13110 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69  (nFull);.  cygwi
13120 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77  n_conv_to_full_w
13130 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74  in32_path(zRelat
13140 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72  ive, zFull);.  r
13150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13160 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
13170 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
13180 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
13190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
131a0 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
131b0 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
131c0 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
131d0 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
131e0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
131f0 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
13200 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  old. */.  sqlite
13210 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d  3_snprintf(pVfs-
13220 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  >mxPathname, zFu
13230 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
13240 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ive);.  return S
13250 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
13260 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
13270 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
13280 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
13290 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f   int nByte;.  vo
132a0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
132b0 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20    char *zOut;.. 
132c0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
132d0 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
132e0 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
132f0 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
13300 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
13310 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
13320 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
13330 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
13340 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
13350 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
13360 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
13370 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20  Relative[1]) && 
13380 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a  zRelative[2]==':
13390 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69  ' ){.    zRelati
133a0 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ve++;.  }..  /* 
133b0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
133c0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
133d0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
133e0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
133f0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
13400 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
13410 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
13420 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
13430 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
13440 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
13450 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
13460 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
13470 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
13480 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
13490 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
134a0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
134b0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
134c0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
134d0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
134e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
134f0 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65  nFull);.  zConve
13500 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
13510 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
13520 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73 4e  tive);.  if( isN
13530 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52  T() ){.    WCHAR
13540 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
13550 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68  te = GetFullPath
13560 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43  NameW((WCHAR*)zC
13570 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
13580 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d  0) + 3;.    zTem
13590 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  p = malloc( nByt
135a0 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
135b0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
135c0 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
135d0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
135e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
135f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
13600 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61   }.    GetFullPa
13610 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29  thNameW((WCHAR*)
13620 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
13630 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
13640 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
13650 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75  d);.    zOut = u
13660 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
13670 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54  mp);.    free(zT
13680 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  emp);./* isNT() 
13690 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
136a0 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
136b0 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
136c0 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
136d0 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
136e0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
136f0 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
13700 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
13710 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
13720 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
13730 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
13740 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
13750 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
13760 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
13770 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
13780 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47  p;.    nByte = G
13790 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
137a0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
137b0 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b  d, 0, 0, 0) + 3;
137c0 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c  .    zTemp = mal
137d0 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
137e0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
137f0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
13800 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43  ){.      free(zC
13810 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
13820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13830 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
13840 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
13850 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
13860 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
13870 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 0);.    free(z
13880 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
13890 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
138a0 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
138b0 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
138c0 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64 69  ee(zTemp);.#endi
138d0 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74  f.  }.  if( zOut
138e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
138f0 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
13900 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  xPathname, zFull
13910 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
13920 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20     free(zOut);. 
13930 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13940 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
13950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13960 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
13970 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74  f.}../*.** Get t
13980 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f  he sector size o
13990 66 20 74 68 65 20 64 65 76 69 63 65 20 75 73 65  f the device use
139a0 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 66 69  d to store.** fi
139b0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
139c0 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28  t getSectorSize(
139d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
139e0 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e 73   *pVfs,.    cons
139f0 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
13a00 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 66  e     /* UTF-8 f
13a10 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  ile name */.){. 
13a20 20 44 57 4f 52 44 20 62 79 74 65 73 50 65 72 53   DWORD bytesPerS
13a30 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
13a40 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
13a50 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44 69 73 6b  ZE;.  /* GetDisk
13a60 46 72 65 65 53 70 61 63 65 20 69 73 20 6e 6f 74  FreeSpace is not
13a70 20 73 75 70 70 6f 72 74 65 64 20 75 6e 64 65 72   supported under
13a80 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66 20 53 51   WINCE */.#if SQ
13a90 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13aa0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13ab0 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
13ac0 5f 50 41 52 41 4d 45 54 45 52 28 7a 52 65 6c 61  _PARAMETER(zRela
13ad0 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63  tive);.#else.  c
13ae0 68 61 72 20 7a 46 75 6c 6c 70 61 74 68 5b 4d 41  har zFullpath[MA
13af0 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 6e 74  X_PATH+1];.  int
13b00 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 64 77 52   rc;.  DWORD dwR
13b10 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  et = 0;.  DWORD 
13b20 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a 20  dwDummy;..  /*. 
13b30 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 67   ** We need to g
13b40 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  et the full path
13b50 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
13b60 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74 20 74 68  e.  ** to get th
13b70 65 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 74  e drive letter t
13b80 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73 65  o look up the se
13b90 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a  ctor.  ** size..
13ba0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
13bb0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
13bc0 0a 20 20 72 63 20 3d 20 77 69 6e 46 75 6c 6c 50  .  rc = winFullP
13bd0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 52  athname(pVfs, zR
13be0 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50 41 54  elative, MAX_PAT
13bf0 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20  H, zFullpath);. 
13c00 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13c10 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 69 66 28  Benign(0);.  if(
13c20 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc == SQLITE_OK
13c30 20 29 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64 20   ).  {.    void 
13c40 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
13c50 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
13c60 65 28 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20  e(zFullpath);.  
13c70 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
13c80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
13c90 4e 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NT() ){.        
13ca0 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20  /* trim path to 
13cb0 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72  just drive refer
13cc0 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ence */.        
13cd0 57 43 48 41 52 20 2a 70 20 3d 20 7a 43 6f 6e 76  WCHAR *p = zConv
13ce0 65 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66  erted;.        f
13cf0 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20  or(;*p;p++){.   
13d00 20 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d         if( *p ==
13d10 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20   '\\' ){.       
13d20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a       *p = '\0';.
13d30 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
13d40 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
13d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13d60 20 64 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b   dwRet = GetDisk
13d70 46 72 65 65 53 70 61 63 65 57 28 28 57 43 48 41  FreeSpaceW((WCHA
13d80 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13db0 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20   &dwDummy,.     
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79               &by
13de0 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20  tesPerSector,.  
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20  &dwDummy,.      
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
13e40 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ummy);.      }el
13e50 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74  se{.        /* t
13e60 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74  rim path to just
13e70 20 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65   drive reference
13e80 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
13e90 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 7a 43   *p = (char *)zC
13ea0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20  onverted;.      
13eb0 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a    for(;*p;p++){.
13ec0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
13ed0 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20   == '\\' ){.    
13ee0 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30          *p = '\0
13ef0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ';.            b
13f00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
13f10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13f20 20 20 20 20 64 77 52 65 74 20 3d 20 47 65 74 44      dwRet = GetD
13f30 69 73 6b 46 72 65 65 53 70 61 63 65 41 28 28 63  iskFreeSpaceA((c
13f40 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
13f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20     &dwDummy,.   
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
13fa0 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a  bytesPerSector,.
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20    &dwDummy,.    
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
14000 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d  wDummy);.      }
14010 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  .      free(zCon
14020 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20  verted);.    }. 
14030 20 20 20 69 66 28 20 21 64 77 52 65 74 20 29 7b     if( !dwRet ){
14040 0a 20 20 20 20 20 20 62 79 74 65 73 50 65 72 53  .      bytesPerS
14050 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
14060 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
14070 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ZE;.    }.  }.#e
14080 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 69  ndif.  return (i
14090 6e 74 29 20 62 79 74 65 73 50 65 72 53 65 63 74  nt) bytesPerSect
140a0 6f 72 3b 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  or; .}..#ifndef 
140b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
140c0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
140d0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
140e0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
140f0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
14100 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
14110 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
14120 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
14130 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
14140 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
14150 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
14160 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
14170 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
14180 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
14190 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
141a0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
141b0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
141c0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
141d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
141e0 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
141f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
14200 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
14210 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
14220 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  h;.  void *zConv
14230 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
14240 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
14250 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
14260 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
14270 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
14280 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
14290 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
142a0 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68   isNT() ){.    h
142b0 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   = LoadLibraryW(
142c0 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
142d0 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  ed);./* isNT() i
142e0 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
142f0 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
14300 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
14310 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
14320 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
14330 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
14340 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
14350 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
14360 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
14370 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
14380 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
14390 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
143a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
143b0 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
143c0 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62  .    h = LoadLib
143d0 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
143e0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
143f0 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
14400 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
14410 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
14420 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
14430 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
14440 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
14450 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
14460 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
14470 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65  ETER(pVfs);.  ge
14480 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e 42  tLastErrorMsg(nB
14490 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  uf, zBufOut);.}.
144a0 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28  void (*winDlSym(
144b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
144c0 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
144d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
144e0 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20  ymbol))(void){. 
144f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
14500 52 28 70 56 66 73 29 3b 0a 23 69 66 20 53 51 4c  R(pVfs);.#if SQL
14510 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
14520 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
14530 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
14540 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
14550 65 20 6f 6e 20 77 69 6e 63 65 2e 20 2a 2f 0a 20  e on wince. */. 
14560 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29   return (void(*)
14570 28 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64  (void))GetProcAd
14580 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
14590 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
145a0 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c  ;.#else.  /* All
145b0 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 73 20 70   other windows p
145c0 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20  latforms expect 
145d0 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29  GetProcAddress()
145e0 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e   to take.  ** an
145f0 20 41 6e 73 69 20 73 74 72 69 6e 67 20 72 65 67   Ansi string reg
14600 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f  ardless of the _
14610 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20  UNICODE setting 
14620 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  */.  return (voi
14630 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72  d(*)(void))GetPr
14640 6f 63 41 64 64 72 65 73 73 28 28 48 41 4e 44 4c  ocAddress((HANDL
14650 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  E)pHandle, zSymb
14660 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f  ol);.#endif.}.vo
14670 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71  id winDlClose(sq
14680 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14690 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
146a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
146b0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 46 72 65  TER(pVfs);.  Fre
146c0 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
146d0 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  )pHandle);.}.#el
146e0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
146f0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
14700 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
14710 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
14720 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
14730 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
14740 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
14750 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
14760 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
14770 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  endif.../*.** Wr
14780 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62  ite up to nBuf b
14790 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65  ytes of randomne
147a0 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f  ss into zBuf..*/
147b0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
147c0 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
147d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
147e0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
147f0 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  f){.  int n = 0;
14800 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
14810 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64  TER(pVfs);.#if d
14820 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
14830 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a  ST).  n = nBuf;.
14840 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
14850 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  , nBuf);.#else. 
14860 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54   if( sizeof(SYST
14870 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20  EMTIME)<=nBuf-n 
14880 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d  ){.    SYSTEMTIM
14890 45 20 78 3b 0a 20 20 20 20 47 65 74 53 79 73 74  E x;.    GetSyst
148a0 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20  emTime(&x);.    
148b0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
148c0 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
148d0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
148e0 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (x);.  }.  if( s
148f0 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
14900 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
14910 44 20 70 69 64 20 3d 20 47 65 74 43 75 72 72 65  D pid = GetCurre
14920 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
14930 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
14940 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
14950 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
14960 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
14970 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
14980 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
14990 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
149a0 20 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b   GetTickCount();
149b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
149c0 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
149d0 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
149e0 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
149f0 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
14a00 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
14a10 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
14a20 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
14a30 20 20 20 20 51 75 65 72 79 50 65 72 66 6f 72 6d      QueryPerform
14a40 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b  anceCounter(&i);
14a50 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
14a60 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66  f[n], &i, sizeof
14a70 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (i));.    n += s
14a80 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65  izeof(i);.  }.#e
14a90 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ndif.  return n;
14aa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
14ab0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
14ac0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
14ad0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
14ae0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
14af0 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
14b00 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14b10 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
14b20 20 20 53 6c 65 65 70 28 28 6d 69 63 72 6f 73 65    Sleep((microse
14b30 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
14b40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
14b50 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
14b60 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
14b70 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
14b80 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
14b90 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
14ba0 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
14bb0 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
14bc0 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
14bd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
14be0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
14bf0 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
14c00 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
14c10 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
14c20 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
14c30 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
14c40 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14c50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
14c60 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
14c70 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
14c80 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
14c90 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
14ca0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
14cb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
14cc0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
14cd0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
14ce0 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
14cf0 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
14d00 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
14d10 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
14d20 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
14d30 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
14d40 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
14d50 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
14d60 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
14d70 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
14d80 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
14d90 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
14da0 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
14db0 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
14dc0 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
14dd0 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
14de0 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
14df0 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
14e00 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
14e10 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
14e20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
14e30 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
14e40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
14e50 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
14e60 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
14e70 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
14e80 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
14e90 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
14ea0 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
14eb0 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
14ec0 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
14ed0 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
14ee0 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
14ef0 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
14f00 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
14f10 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
14f20 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
14f30 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
14f40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e  qlite3_int64 win
14f50 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20  FiletimeEpoch = 
14f60 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65  23058135*(sqlite
14f70 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
14f80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
14f90 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EST.  static con
14fa0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
14fb0 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
14fc0 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
14fd0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65  nt64)8640000;.#e
14fe0 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d  ndif.  /* 2^32 -
14ff0 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66   to avoid use of
15000 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73   LL and warnings
15010 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61   in gcc */.  sta
15020 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
15030 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74  3_int64 max32Bit
15040 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28  Value = .      (
15050 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
15060 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
15070 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
15080 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
15090 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
150a0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
150b0 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
150c0 4d 45 20 74 69 6d 65 3b 0a 20 20 47 65 74 53 79  ME time;.  GetSy
150d0 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
150e0 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
150f0 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
15100 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
15110 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
15120 28 21 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  (!SystemTimeToFi
15130 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
15140 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  )){.    return 1
15150 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 47 65  ;.  }.#else.  Ge
15160 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
15170 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
15180 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
15190 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
151a0 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
151b0 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
151c0 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
151d0 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
151e0 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
151f0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
15200 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
15210 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
15220 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
15230 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
15240 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
15250 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
15260 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
15270 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
15280 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
15290 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
152a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
152b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
152c0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
152d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
152e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
152f0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
15300 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
15310 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
15320 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
15330 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
15340 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
15350 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
15360 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
15370 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
15380 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
15390 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
153a0 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
153b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
153c0 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
153d0 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
153e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
153f0 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
15400 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
15410 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
15420 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
15430 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
15440 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15450 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
15460 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
15470 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
15480 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
15490 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
154a0 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
154b0 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 77 69 6e  Message() on win
154c0 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
154d0 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
154e0 28 29 20 6f 6e 20 75 6e 69 78 29 2e 20 41 66 74  () on unix). Aft
154f0 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
15500 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
15510 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
15520 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
15530 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
15540 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
15550 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
15560 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
15570 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
15580 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
15590 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
155a0 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
155b0 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
155c0 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
155d0 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
155e0 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
155f0 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
15600 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
15610 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
15620 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
15630 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
15640 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
15650 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
15660 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
15670 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
15680 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
15690 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
156a0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
156b0 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
156c0 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
156d0 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
156e0 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
156f0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
15700 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
15710 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
15720 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
15730 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
15740 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
15750 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
15760 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
15770 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
15780 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
15790 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
157a0 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
157b0 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
157c0 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
157d0 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
157e0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
157f0 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
15800 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15810 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
15820 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
15830 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
15840 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
15850 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
15860 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
15870 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
15880 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
15890 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
158a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
158b0 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
158c0 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
158d0 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
158e0 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
158f0 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
15900 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
15910 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
15920 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
15930 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
15940 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
15950 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
15960 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
15970 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
15980 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
15990 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
159a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
159b0 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  Vfs);.  return g
159c0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e  etLastErrorMsg(n
159d0 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 0a  Buf, zBuf);.}...
159e0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
159f0 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
15a00 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
15a10 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
15a20 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
15a30 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
15a40 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
15a50 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
15a60 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
15a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
15a80 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
15a90 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
15aa0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
15ab0 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20  .    MAX_PATH,  
15ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
15ad0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
15ae0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15af0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
15b00 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
15b10 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
15b20 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15b40 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
15b50 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
15b60 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
15b70 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
15b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
15b90 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
15ba0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
15bb0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
15bc0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
15bd0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
15be0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
15bf0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
15c00 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
15c10 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
15c20 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
15c30 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
15c40 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
15c50 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
15c60 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
15c70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
15c80 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
15c90 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
15ca0 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
15cb0 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
15cc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15cd0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
15ce0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
15cf0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
15d00 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
15d10 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
15d20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
15d30 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
15d40 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
15d50 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
15d60 34 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  4 */.    0,     
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d80 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
15d90 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
15da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15db0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
15dc0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
15dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
15de0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
15df0 20 20 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51    };..#ifndef SQ
15e00 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
15e10 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
15e20 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
15e30 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
15e40 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
15e50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
15e60 45 4d 5f 49 4e 46 4f 29 29 3b 0a 20 20 47 65 74  EM_INFO));.  Get
15e70 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
15e80 79 73 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  ysInfo);.  asser
15e90 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  t(winSysInfo.dwA
15ea0 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
15eb0 72 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69  rity > 0);.#endi
15ec0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  f..  sqlite3_vfs
15ed0 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66  _register(&winVf
15ee0 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  s, 1);.  return 
15ef0 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e  SQLITE_OK; .}.in
15f00 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
15f10 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72  (void){ .  retur
15f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15f30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15f40 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.