/ Hex Artifact Content
Login

Artifact 8449cb4ce1cd50248b7133108532d9582cc6c042:


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 28 72 63 20 3d 20 47 65 74 46 69 6c  le( (rc = GetFil
12940 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
12950 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65  WCHAR*)zConverte
12960 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
12990 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20  ndard, .        
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129b0 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
129c0 29 20 26 26 20 72 63 3d 3d 30 20 26 26 20 72 65  ) && rc==0 && re
129d0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 29 20 29  tryIoerr(&cnt) )
129e0 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  {}.    if( rc ){
129f0 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
12a00 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
12a10 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
12a20 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
12a30 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
12a40 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
12a50 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
12a60 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
12a70 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
12a80 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
12a90 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
12aa0 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
12ab0 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
12ac0 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53  sAttrData.nFileS
12ad0 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  izeLow==0 ){.   
12ae0 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
12af0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
12b00 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  TES;.      }else
12b10 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
12b20 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
12b30 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
12b40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
12b50 20 20 20 20 20 20 69 66 28 20 47 65 74 4c 61 73        if( GetLas
12b60 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f  tError()!=ERROR_
12b70 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  FILE_NOT_FOUND )
12b80 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67  {.        winLog
12b90 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12ba0 52 52 5f 41 43 43 45 53 53 2c 20 22 77 69 6e 41  RR_ACCESS, "winA
12bb0 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  ccess", zFilenam
12bc0 65 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  e);.        free
12bd0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
12be0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12bf0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
12c00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12c10 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
12c20 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
12c30 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20  BUTES;.      }. 
12c40 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69     }./* isNT() i
12c50 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
12c60 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
12c70 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
12c80 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
12c90 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
12ca0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
12cb0 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
12cc0 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
12cd0 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
12ce0 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
12cf0 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
12d00 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
12d10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
12d20 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
12d30 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65 74 46  .    attr = GetF
12d40 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
12d50 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
12d60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
12d70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
12d80 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67  ;.  switch( flag
12d90 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  s ){.    case SQ
12da0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
12db0 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
12dc0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
12dd0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
12de0 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
12df0 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
12e00 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12e10 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
12e20 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20  EADWRITE:.      
12e30 72 63 20 3d 20 28 61 74 74 72 20 26 20 46 49 4c  rc = (attr & FIL
12e40 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
12e50 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
12e60 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
12e70 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
12e80 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
12e90 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
12ea0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
12eb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12ec0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12ed0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
12ee0 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
12ef0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
12f00 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
12f10 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
12f20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
12f30 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
12f40 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
12f50 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
12f60 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
12f70 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
12f80 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
12f90 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
12fa0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
12fb0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
12fc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
12fd0 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
12fe0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
12ff0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
13000 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
13030 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
13040 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
13050 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
13060 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
13070 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
13080 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
13090 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
130a0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
130b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
130c0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
130d0 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
130e0 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66  cygwin_conv_to_f
130f0 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a  ull_win32_path(z
13100 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29  Relative, zFull)
13110 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13120 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
13130 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
13140 45 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  E.  SimulateIOEr
13150 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
13160 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e  TE_ERROR );.  UN
13170 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
13180 46 75 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43  Full);.  /* WinC
13190 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74  E has no concept
131a0 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70   of a relative p
131b0 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49  athname, or so I
131c0 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73   am told. */.  s
131d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
131e0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
131f0 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
13200 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74  Relative);.  ret
13210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
13220 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
13230 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
13240 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
13250 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  __).  int nByte;
13260 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
13270 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
13280 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
13290 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
132a0 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
132b0 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
132c0 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
132d0 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
132e0 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
132f0 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
13300 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
13310 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
13320 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  ' && sqlite3Isal
13330 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d  pha(zRelative[1]
13340 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32  ) && zRelative[2
13350 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52  ]==':' ){.    zR
13360 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
13370 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
13380 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
13390 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
133a0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
133b0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
133c0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
133d0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
133e0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
133f0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
13400 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
13410 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
13420 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
13430 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
13440 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
13450 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
13460 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
13470 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
13480 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13490 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
134a0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
134b0 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a  ETER(nFull);.  z
134c0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
134d0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
134e0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
134f0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
13500 57 43 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20  WCHAR *zTemp;.  
13510 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
13520 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41  lPathNameW((WCHA
13530 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  R*)zConverted, 0
13540 2c 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20  , 0, 0) + 3;.   
13550 20 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28   zTemp = malloc(
13560 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
13570 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
13580 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
13590 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65       free(zConve
135a0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
135b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
135c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46  ;.    }.    GetF
135d0 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43  ullPathNameW((WC
135e0 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  HAR*)zConverted,
135f0 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
13600 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  );.    free(zCon
13610 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
13620 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  t = unicodeToUtf
13630 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
13640 65 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20 69 73  ee(zTemp);./* is
13650 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c  NT() is 1 if SQL
13660 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c  ITE_OS_WINCE==1,
13670 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73   so this else is
13680 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e   never executed.
13690 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41   .** Since the A
136a0 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20  SCII version of 
136b0 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50  these Windows AP
136c0 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66  I do not exist f
136d0 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27  or WINCE,.** it'
136e0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
136f0 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ot reference the
13700 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c  m for WINCE buil
13710 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ds..*/.#if SQLIT
13720 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20  E_OS_WINCE==0.  
13730 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
13740 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
13750 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
13760 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
13770 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
13780 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20   + 3;.    zTemp 
13790 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a  = malloc( nByte*
137a0 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
137b0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
137c0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  p==0 ){.      fr
137d0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
137e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
137f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
13800 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68  .    GetFullPath
13810 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
13820 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
13830 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66  zTemp, 0);.    f
13840 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
13850 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
13860 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
13870 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
13880 20 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a     free(zTemp);.
13890 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28  #endif.  }.  if(
138a0 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
138b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
138c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
138d0 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
138e0 74 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75  t);.    free(zOu
138f0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
13900 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
13910 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
13920 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13930 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
13940 47 65 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  Get the sector s
13950 69 7a 65 20 6f 66 20 74 68 65 20 64 65 76 69 63  ize of the devic
13960 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
13970 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ** file..*/.stat
13980 69 63 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72  ic int getSector
13990 53 69 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65  Size(.    sqlite
139a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20  3_vfs *pVfs,.   
139b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
139c0 6c 61 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54  lative     /* UT
139d0 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  F-8 file name */
139e0 0a 29 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65  .){.  DWORD byte
139f0 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c  sPerSector = SQL
13a00 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
13a10 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65  OR_SIZE;.  /* Ge
13a20 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 20 69  tDiskFreeSpace i
13a30 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
13a40 75 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23  under WINCE */.#
13a50 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
13a60 43 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  CE.  UNUSED_PARA
13a70 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
13a80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
13a90 7a 52 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73  zRelative);.#els
13aa0 65 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61  e.  char zFullpa
13ab0 74 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a  th[MAX_PATH+1];.
13ac0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
13ad0 44 20 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44  D dwRet = 0;.  D
13ae0 57 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20  WORD dwDummy;.. 
13af0 20 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64   /*.  ** We need
13b00 20 74 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c   to get the full
13b10 20 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68   path name of th
13b20 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67  e file.  ** to g
13b30 65 74 20 74 68 65 20 64 72 69 76 65 20 6c 65 74  et the drive let
13b40 74 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74  ter to look up t
13b50 68 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73  he sector.  ** s
13b60 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ize..  */.  Simu
13b70 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
13b80 6e 28 31 29 3b 0a 20 20 72 63 20 3d 20 77 69 6e  n(1);.  rc = win
13b90 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
13ba0 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 4d 41  s, zRelative, MA
13bb0 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c 70 61 74  X_PATH, zFullpat
13bc0 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  h);.  SimulateIO
13bd0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
13be0 20 20 69 66 28 20 72 63 20 3d 3d 20 53 51 4c 49    if( rc == SQLI
13bf0 54 45 5f 4f 4b 20 29 0a 20 20 7b 0a 20 20 20 20  TE_OK ).  {.    
13c00 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
13c10 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
13c20 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 70 61 74 68  lename(zFullpath
13c30 29 3b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6e 76  );.    if( zConv
13c40 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 69  erted ){.      i
13c50 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
13c60 20 20 20 20 20 2f 2a 20 74 72 69 6d 20 70 61 74       /* trim pat
13c70 68 20 74 6f 20 6a 75 73 74 20 64 72 69 76 65 20  h to just drive 
13c80 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 20 20 20  reference */.   
13c90 20 20 20 20 20 57 43 48 41 52 20 2a 70 20 3d 20       WCHAR *p = 
13ca0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
13cb0 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29      for(;*p;p++)
13cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13cd0 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20  *p == '\\' ){.  
13ce0 20 20 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27            *p = '
13cf0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \0';.           
13d00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13d10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
13d20 20 20 20 20 20 20 64 77 52 65 74 20 3d 20 47 65        dwRet = Ge
13d30 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 28  tDiskFreeSpaceW(
13d40 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
13d50 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a        &dwDummy,.
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 26 62 79 74 65 73 50 65 72 53 65 63 74 6f    &bytesPerSecto
13db0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dd0 20 20 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20       &dwDummy,. 
13de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e00 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20   &dwDummy);.    
13e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13e20 20 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f   /* trim path to
13e30 20 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65   just drive refe
13e40 72 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20  rence */.       
13e50 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
13e60 20 2a 29 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   *)zConverted;. 
13e70 20 20 20 20 20 20 20 66 6f 72 28 3b 2a 70 3b 70         for(;*p;p
13e80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
13e90 66 28 20 2a 70 20 3d 3d 20 27 5c 5c 27 20 29 7b  f( *p == '\\' ){
13ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 20  .            *p 
13eb0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
13ec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13ee0 0a 20 20 20 20 20 20 20 20 64 77 52 65 74 20 3d  .        dwRet =
13ef0 20 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63   GetDiskFreeSpac
13f00 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
13f10 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
13f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f60 20 20 20 20 26 62 79 74 65 73 50 65 72 53 65 63      &bytesPerSec
13f70 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
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 26 64 77 44 75 6d 6d 79 2c         &dwDummy,
13fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 20 20 20 26 64 77 44 75 6d 6d 79 29 3b 0a 20 20     &dwDummy);.  
13fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
13fe0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
13ff0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 77 52    }.    if( !dwR
14000 65 74 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  et ){.      byte
14010 73 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c  sPerSector = SQL
14020 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
14030 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 20  OR_SIZE;.    }. 
14040 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
14050 72 6e 20 28 69 6e 74 29 20 62 79 74 65 73 50 65  rn (int) bytesPe
14060 72 53 65 63 74 6f 72 3b 20 0a 7d 0a 0a 23 69 66  rSector; .}..#if
14070 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14080 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
14090 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
140a0 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
140b0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
140c0 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
140d0 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
140e0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
140f0 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
14100 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
14110 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  ..*/./*.** Inter
14120 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
14130 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
14140 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
14150 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
14160 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
14170 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
14180 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
14190 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  brary..*/.static
141a0 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e   void *winDlOpen
141b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
141c0 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
141d0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41  zFilename){.  HA
141e0 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a  NDLE h;.  void *
141f0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
14200 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
14210 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55  (zFilename);.  U
14220 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14230 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f  pVfs);.  if( zCo
14240 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
14250 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14260 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
14270 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72      h = LoadLibr
14280 61 72 79 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  aryW((WCHAR*)zCo
14290 6e 76 65 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e  nverted);./* isN
142a0 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
142b0 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
142c0 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
142d0 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
142e0 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53  .** Since the AS
142f0 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  CII version of t
14300 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
14310 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
14320 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
14330 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
14340 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
14350 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
14360 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
14370 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
14380 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 4c 6f  else{.    h = Lo
14390 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
143a0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
143b0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65  endif.  }.  free
143c0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
143d0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
143e0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
143f0 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
14400 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
14410 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
14420 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
14430 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
14440 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  .  getLastErrorM
14450 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  sg(nBuf, zBufOut
14460 29 3b 0a 7d 0a 76 6f 69 64 20 28 2a 77 69 6e 44  );.}.void (*winD
14470 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
14480 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
14490 61 6e 64 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61  andle, const cha
144a0 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69  r *zSymbol))(voi
144b0 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
144c0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
144d0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
144e0 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72  E.  /* The GetPr
144f0 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75  ocAddressA() rou
14500 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  tine is only ava
14510 69 6c 61 62 6c 65 20 6f 6e 20 77 69 6e 63 65 2e  ilable on wince.
14520 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   */.  return (vo
14530 69 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50  id(*)(void))GetP
14540 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e  rocAddressA((HAN
14550 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79  DLE)pHandle, zSy
14560 6d 62 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 2f  mbol);.#else.  /
14570 2a 20 41 6c 6c 20 6f 74 68 65 72 20 77 69 6e 64  * All other wind
14580 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65 78  ows platforms ex
14590 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64 72  pect GetProcAddr
145a0 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20 20  ess() to take.  
145b0 2a 2a 20 61 6e 20 41 6e 73 69 20 73 74 72 69 6e  ** an Ansi strin
145c0 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  g regardless of 
145d0 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65 74  the _UNICODE set
145e0 74 69 6e 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ting */.  return
145f0 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
14600 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 28  GetProcAddress((
14610 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20  HANDLE)pHandle, 
14620 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65 6e 64 69 66  zSymbol);.#endif
14630 0a 7d 0a 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  .}.void winDlClo
14640 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
14650 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
14660 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
14670 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
14680 20 20 46 72 65 65 4c 69 62 72 61 72 79 28 28 48    FreeLibrary((H
14690 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a  ANDLE)pHandle);.
146a0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
146b0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
146c0 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
146d0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
146e0 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20  e winDlOpen  0. 
146f0 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72   #define winDlEr
14700 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
14710 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  winDlSym   0.  #
14720 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73  define winDlClos
14730 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  e 0.#endif.../*.
14740 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
14750 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
14760 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
14770 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
14780 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
14790 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
147a0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
147b0 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e   *zBuf){.  int n
147c0 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50   = 0;.  UNUSED_P
147d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
147e0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
147f0 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e  TE_TEST).  n = n
14800 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42  Buf;.  memset(zB
14810 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65  uf, 0, nBuf);.#e
14820 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
14830 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42  (SYSTEMTIME)<=nB
14840 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54  uf-n ){.    SYST
14850 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 47 65  EMTIME x;.    Ge
14860 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
14870 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
14880 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
14890 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
148a0 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
148b0 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
148c0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
148d0 20 44 57 4f 52 44 20 70 69 64 20 3d 20 47 65 74   DWORD pid = Get
148e0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
148f0 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
14900 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73  zBuf[n], &pid, s
14910 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20  izeof(pid));.   
14920 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64   n += sizeof(pid
14930 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
14940 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
14950 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
14960 63 6e 74 20 3d 20 47 65 74 54 69 63 6b 43 6f 75  cnt = GetTickCou
14970 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  nt();.    memcpy
14980 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c  (&zBuf[n], &cnt,
14990 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20   sizeof(cnt));. 
149a0 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63     n += sizeof(c
149b0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  nt);.  }.  if( s
149c0 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45  izeof(LARGE_INTE
149d0 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  GER)<=nBuf-n ){.
149e0 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
149f0 52 20 69 3b 0a 20 20 20 20 51 75 65 72 79 50 65  R i;.    QueryPe
14a00 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
14a10 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&i);.    memcpy
14a20 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73  (&zBuf[n], &i, s
14a30 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e  izeof(i));.    n
14a40 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20   += sizeof(i);. 
14a50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
14a60 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
14a70 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
14a80 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
14a90 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
14aa0 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  time slept..*/.s
14ab0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65  tatic int winSle
14ac0 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
14ad0 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73  pVfs, int micros
14ae0 65 63 29 7b 0a 20 20 53 6c 65 65 70 28 28 6d 69  ec){.  Sleep((mi
14af0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
14b00 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
14b10 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
14b20 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63  eturn ((microsec
14b30 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30  +999)/1000)*1000
14b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
14b50 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
14b60 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
14b70 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
14b80 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14b90 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
14ba0 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
14bb0 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
14bc0 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
14bd0 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
14be0 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
14bf0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
14c00 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14c10 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
14c20 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
14c30 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
14c40 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
14c50 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
14c60 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
14c70 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
14c80 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
14c90 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
14ca0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
14cb0 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
14cc0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
14cd0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
14ce0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
14cf0 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
14d00 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
14d10 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
14d20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
14d30 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
14d40 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
14d50 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
14d60 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
14d70 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
14d80 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
14d90 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
14da0 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
14db0 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
14dc0 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
14dd0 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
14de0 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
14df0 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
14e00 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
14e10 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
14e20 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65  TimeInt64(sqlite
14e30 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c  3_vfs *pVfs, sql
14e40 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f  ite3_int64 *piNo
14e50 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d  w){.  /* FILETIM
14e60 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  E structure is a
14e70 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65   64-bit value re
14e80 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e  presenting the n
14e90 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31  umber of .     1
14ea0 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e  00-nanosecond in
14eb0 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61  tervals since Ja
14ec0 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d  nuary 1, 1601 (=
14ed0 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20   JD 2305813.5). 
14ee0 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
14ef0 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
14f00 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
14f10 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
14f20 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
14f30 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
14f40 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
14f50 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
14f60 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
14f70 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
14f80 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
14f90 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
14fa0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
14fb0 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
14fc0 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
14fd0 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
14fe0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
14ff0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
15000 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20  32BitValue = .  
15010 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
15020 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
15030 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
15040 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
15050 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36  ite3_int64)29496
15060 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54  7296;..#if SQLIT
15070 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53  E_OS_WINCE.  SYS
15080 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20  TEMTIME time;.  
15090 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74  GetSystemTime(&t
150a0 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79  ime);.  /* if Sy
150b0 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
150c0 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72  me() fails, it r
150d0 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eturns zero. */.
150e0 20 20 69 66 20 28 21 53 79 73 74 65 6d 54 69 6d    if (!SystemTim
150f0 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
15100 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74  e,&ft)){.    ret
15110 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6c 73 65  urn 1;.  }.#else
15120 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65  .  GetSystemTime
15130 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
15140 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
15150 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
15160 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
15170 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
15180 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
15190 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
151a0 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20  itValue) + .    
151b0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
151c0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c  te3_int64)ft.dwL
151d0 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c  owDateTime)/(sql
151e0 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30  ite3_int64)10000
151f0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
15200 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
15210 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
15220 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
15230 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
15240 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
15250 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
15260 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
15270 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
15280 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
15290 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
152a0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
152b0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
152c0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
152d0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
152e0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
152f0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
15300 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
15310 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
15320 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
15330 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
15340 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
15350 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
15360 2a 2f 0a 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  */.int winCurren
15370 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
15380 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
15390 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
153a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
153b0 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
153c0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
153d0 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
153e0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
153f0 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
15400 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
15410 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
15420 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
15430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
15440 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
15450 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
15460 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
15470 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
15480 6e 20 77 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n windows (or er
15490 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
154a0 72 6f 72 5f 72 28 29 20 6f 6e 20 75 6e 69 78 29  ror_r() on unix)
154b0 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
154c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
154d0 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
154e0 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
154f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
15500 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
15510 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
15520 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
15530 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
15540 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
15550 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
15560 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
15570 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
15580 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
15590 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
155a0 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
155b0 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
155c0 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
155d0 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
155e0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
155f0 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
15600 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
15610 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
15620 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
15630 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
15640 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
15650 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
15660 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
15670 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
15680 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
15690 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
156a0 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
156b0 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
156c0 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
156d0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
156e0 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
156f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
15700 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
15710 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
15720 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
15730 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
15740 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
15750 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
15760 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
15770 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
15780 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
15790 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
157a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
157b0 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
157c0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
157d0 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
157e0 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
157f0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
15800 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
15810 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
15820 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
15830 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
15840 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
15850 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
15860 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
15870 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
15880 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
15890 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
158a0 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
158b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
158c0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
158d0 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
158e0 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
158f0 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
15900 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
15910 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
15920 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
15930 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
15940 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
15950 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
15960 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
15970 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
15980 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72  urn getLastError
15990 4d 73 67 28 6e 42 75 66 2c 20 7a 42 75 66 29 3b  Msg(nBuf, zBuf);
159a0 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  .}..../*.** Init
159b0 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
159c0 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
159d0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
159e0 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
159f0 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
15a00 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
15a10 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
15a20 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15a40 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
15a50 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
15a60 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
15a70 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41  le */.    MAX_PA
15a80 54 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  TH,            /
15a90 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
15aa0 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
15ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
15ac0 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
15ad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15ae0 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
15b10 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
15b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
15b30 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
15b40 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
15b50 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
15b60 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
15b70 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
15b80 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
15b90 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
15ba0 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
15bb0 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
15bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
15bd0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
15be0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
15bf0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
15c00 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
15c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
15c20 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
15c30 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
15c40 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
15c50 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
15c60 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
15c70 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
15c80 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
15c90 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
15ca0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
15cb0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
15cc0 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
15cd0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
15ce0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
15cf0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
15d00 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
15d10 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
15d20 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 30 2c  eInt64 */.    0,
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
15d50 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 30 2c 20 20  Call */.    0,  
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
15d80 6c 6c 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  ll */.    0,    
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15da0 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
15db0 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 23 69 66 6e 64  l */.  };..#ifnd
15dc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
15dd0 41 4c 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  AL.  /* get memo
15de0 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
15df0 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
15e00 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
15e10 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
15e20 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
15e30 20 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28    GetSystemInfo(
15e40 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 20 20  &winSysInfo);.  
15e50 61 73 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66  assert(winSysInf
15e60 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
15e70 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a  anularity > 0);.
15e80 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
15e90 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
15ea0 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65  winVfs, 1);.  re
15eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
15ec0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
15ed0 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 20 20  s_end(void){ .  
15ee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ef0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
15f00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a  QLITE_OS_WIN */.