/ Hex Artifact Content
Login

Artifact eafcd6b91cf204a7ef29ac1ef2a1b7132e132e58:


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 23  rn errcode;.}..#
3160: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3170: 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  CE./************
3180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
31c0: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f   This section co
31d0: 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20  ntains code for 
31e0: 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f  WinCE only..*/./
31f0: 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 43 45 20 64  *.** WindowsCE d
3200: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c  oes not have a l
3210: 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74  ocaltime() funct
3220: 69 6f 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20  ion.  So create 
3230: 61 0a 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e  a.** substitute.
3240: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69  .*/.#include <ti
3250: 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20  me.h>.struct tm 
3260: 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69  *__cdecl localti
3270: 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20  me(const time_t 
3280: 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73  *t).{.  static s
3290: 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49  truct tm y;.  FI
32a0: 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b  LETIME uTm, lTm;
32b0: 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54  .  SYSTEMTIME pT
32c0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  m;.  sqlite3_int
32d0: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
32e0: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
32f0: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
3300: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
3310: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
3320: 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78  (DWORD)(t64 & 0x
3330: 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d  FFFFFFFF);.  uTm
3340: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d  .dwHighDateTime=
3350: 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20   (DWORD)(t64 >> 
3360: 33 32 29 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54  32);.  FileTimeT
3370: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
3380: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c  uTm,&lTm);.  Fil
3390: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
33a0: 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20  e(&lTm,&pTm);.  
33b0: 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e  y.tm_year = pTm.
33c0: 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20  wYear - 1900;.  
33d0: 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77  y.tm_mon = pTm.w
33e0: 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74  Month - 1;.  y.t
33f0: 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_wday = pTm.wDa
3400: 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f  yOfWeek;.  y.tm_
3410: 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b  mday = pTm.wDay;
3420: 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70  .  y.tm_hour = p
3430: 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d  Tm.wHour;.  y.tm
3440: 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75  _min = pTm.wMinu
3450: 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d  te;.  y.tm_sec =
3460: 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20   pTm.wSecond;.  
3470: 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a 2f 2a  return &y;.}../*
3480: 20 54 68 69 73 20 77 69 6c 6c 20 6e 65 76 65 72   This will never
3490: 20 62 65 20 63 61 6c 6c 65 64 2c 20 62 75 74 20   be called, but 
34a0: 64 65 66 69 6e 65 64 20 74 6f 20 6d 61 6b 65 20  defined to make 
34b0: 74 68 65 20 63 6f 64 65 20 63 6f 6d 70 69 6c 65  the code compile
34c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 54   */.#define GetT
34d0: 65 6d 70 50 61 74 68 41 28 61 2c 62 29 0a 0a 23  empPathA(a,b)..#
34e0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
34f0: 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20 20 20  a,b,c,d,e)      
3500: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
3510: 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a 23  a, b, c, d, e).#
3520: 64 65 66 69 6e 65 20 55 6e 6c 6f 63 6b 46 69 6c  define UnlockFil
3530: 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20 20 20 20  e(a,b,c,d,e)    
3540: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
3550: 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29  (&a, b, c, d, e)
3560: 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c  .#define LockFil
3570: 65 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29  eEx(a,b,c,d,e,f)
3580: 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65     winceLockFile
3590: 45 78 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c 20  Ex(&a, b, c, d, 
35a0: 65 2c 20 66 29 0a 0a 23 64 65 66 69 6e 65 20 48  e, f)..#define H
35b0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
35c0: 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28  (a) (winFile*)&(
35d0: 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29  (char*)a)[-(int)
35e0: 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65  offsetof(winFile
35f0: 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ,h)]../*.** Acqu
3600: 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ire a lock on th
3610: 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74  e handle h.*/.st
3620: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d  atic void winceM
3630: 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44  utexAcquire(HAND
3640: 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20  LE h){.   DWORD 
3650: 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20  dwErr;.   do {. 
3660: 20 20 20 20 64 77 45 72 72 20 3d 20 57 61 69 74      dwErr = Wait
3670: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
3680: 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20  h, INFINITE);.  
3690: 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72 20   } while (dwErr 
36a0: 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  != WAIT_OBJECT_0
36b0: 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41 49   && dwErr != WAI
36c0: 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a  T_ABANDONED);.}.
36d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
36e0: 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62 79  lock acquired by
36f0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
3700: 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  re().*/.#define 
3710: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
3720: 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65  e(h) ReleaseMute
3730: 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  x(h)../*.** Crea
3740: 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  te the mutex and
3750: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75   shared memory u
3760: 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
3770: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64  in the file.** d
3780: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a  escriptor pFile.
3790: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
37a0: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63  inceCreateLock(c
37b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
37c0: 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70  name, winFile *p
37d0: 46 69 6c 65 29 7b 0a 20 20 57 43 48 41 52 20 2a  File){.  WCHAR *
37e0: 7a 54 6f 6b 3b 0a 20 20 57 43 48 41 52 20 2a 7a  zTok;.  WCHAR *z
37f0: 4e 61 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Name = utf8ToUni
3800: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
3810: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
3820: 54 52 55 45 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  TRUE;..  /* Init
3830: 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c  ialize the local
3840: 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 5a   lockdata */.  Z
3850: 65 72 6f 4d 65 6d 6f 72 79 28 26 70 46 69 6c 65  eroMemory(&pFile
3860: 2d 3e 6c 6f 63 61 6c 2c 20 73 69 7a 65 6f 66 28  ->local, sizeof(
3870: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
3880: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
3890: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
38a0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
38b0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
38c0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
38d0: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
38e0: 0a 20 20 7a 54 6f 6b 20 3d 20 43 68 61 72 4c 6f  .  zTok = CharLo
38f0: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
3900: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
3910: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
3920: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
3930: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
3940: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
3950: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
3960: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
3970: 20 3d 20 43 72 65 61 74 65 4d 75 74 65 78 57 28   = CreateMutexW(
3980: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
3990: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
39a0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
39b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
39c0: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
39d0: 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
39e0: 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
39f0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
3a00: 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
3a10: 0a 20 20 20 20 66 72 65 65 28 7a 4e 61 6d 65 29  .    free(zName)
3a20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
3a30: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  SE;.  }..  /* Ac
3a40: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
3a50: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
3a60: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
3a70: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
3a80: 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a  hMutex);.  .  /*
3a90: 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
3aa0: 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
3ab0: 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
3ac0: 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
3ad0: 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d   are .  ** case-
3ae0: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
3af0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
3b00: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
3b10: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
3b20: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
3b30: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
3b40: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
3b50: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 43 68 61 72 55  me..  */.  CharU
3b60: 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  pperW(zName);.  
3b70: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
3b80: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
3b90: 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ngW(INVALID_HAND
3ba0: 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a  LE_VALUE, NULL,.
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44         PAGE_READ
3be0: 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66  WRITE, 0, sizeof
3bf0: 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20  (winceLock),.   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20      zName);  .. 
3c30: 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74   /* Set a flag t
3c40: 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77 65  hat indicates we
3c50: 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74 6f  're the first to
3c60: 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f   create the memo
3c70: 72 79 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d  ry so it .  ** m
3c80: 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
3c90: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 66 20  ialized */.  if 
3ca0: 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  (GetLastError() 
3cb0: 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59  == ERROR_ALREADY
3cc0: 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49  _EXISTS){.    bI
3cd0: 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d  nit = FALSE;.  }
3ce0: 0a 0a 20 20 66 72 65 65 28 7a 4e 61 6d 65 29 3b  ..  free(zName);
3cf0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
3d00: 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
3d10: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
3d20: 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
3d30: 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  t. */.  if (pFil
3d40: 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20  e->hShared){.   
3d50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
3d60: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 4d 61 70   (winceLock*)Map
3d70: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
3d80: 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20  ->hShared, .    
3d90: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41           FILE_MA
3da0: 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f  P_READ|FILE_MAP_
3db0: 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a  WRITE, 0, 0, siz
3dc0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
3dd0: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69  .    /* If mappi
3de0: 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65  ng failed, close
3df0: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
3e00: 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72  ry handle and er
3e10: 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ase it */.    if
3e20: 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64   (!pFile->shared
3e30: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
3e40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
3e50: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
3e60: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
3e70: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 77 69 6e  LITE_ERROR, "win
3e80: 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20  ceCreateLock2", 
3e90: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
3ea0: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
3eb0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
3ec0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
3ed0: 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
3ee0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
3ef0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
3f00: 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
3f10: 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
3f20: 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
3f30: 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
3f40: 3e 68 53 68 61 72 65 64 20 3d 3d 20 4e 55 4c 4c  >hShared == NULL
3f50: 29 7b 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  ){.    winceMute
3f60: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
3f70: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 43 6c 6f  hMutex);.    Clo
3f80: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
3f90: 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69  hMutex);.    pFi
3fa0: 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c  le->hMutex = NUL
3fb0: 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41  L;.    return FA
3fc0: 4c 53 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  LSE;.  }.  .  /*
3fd0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3fe0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
3ff0: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
4000: 74 6f 20 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69  to */.  if (bIni
4010: 74 29 20 7b 0a 20 20 20 20 5a 65 72 6f 4d 65 6d  t) {.    ZeroMem
4020: 6f 72 79 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  ory(pFile->share
4030: 64 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  d, sizeof(winceL
4040: 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69  ock));.  }..  wi
4050: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
4060: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
4070: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 7d    return TRUE;.}
4080: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
4090: 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
40a0: 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
40b0: 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
40c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
40d0: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
40e0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
40f0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
4100: 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
4110: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
4120: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
4130: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
4140: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
4150: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
4160: 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
4170: 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
4180: 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
4190: 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
41a0: 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
41b0: 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
41c0: 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
41d0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
41e0: 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
41f0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
4200: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
4210: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
4220: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
4230: 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
4240: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
4250: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
4260: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
4270: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
4280: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
4290: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
42a0: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
42b0: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
42c0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
42d0: 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
42e0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
42f0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
4300: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
4310: 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
4320: 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
4330: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
4340: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 55 6e  handle */.    Un
4350: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
4360: 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20  ile->shared);.  
4370: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46    CloseHandle(pF
4380: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
4390: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
43a0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
43b0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
43c0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
43d0: 78 29 3b 20 20 20 20 0a 20 20 20 20 43 6c 6f 73  x);    .    Clos
43e0: 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
43f0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
4400: 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
4410: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
4420: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
4430: 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c  n of the LockFil
4440: 65 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64 6f  e() API of windo
4450: 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a  ws for wince.*/.
4460: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
4470: 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e  eLockFile(.  HAN
4480: 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44  DLE *phFile,.  D
4490: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
44a0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
44b0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
44c0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
44d0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
44e0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
44f0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
4500: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
4510: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
4520: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
4530: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
4540: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
4550: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
4560: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
4570: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
4580: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
4590: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
45a0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
45b0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
45c0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
45d0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
45e0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
45f0: 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
4600: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
4610: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
4620: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
4630: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
4640: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
4650: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
4660: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
4670: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
4680: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
4690: 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
46a0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
46b0: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
46c0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
46d0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
46e0: 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
46f0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
4700: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
4710: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
4720: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
4730: 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
4740: 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
4750: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
4760: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
4770: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
4780: 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
4790: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
47a0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
47b0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
47c0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
47d0: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
47e0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
47f0: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
4800: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
4810: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
4820: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
4830: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
4840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
4850: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
4860: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
4870: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
4880: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
4890: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
48a0: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
48b0: 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62  NG_BYTE && nNumb
48c0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
48d0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
48e0: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
48f0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
4900: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
4910: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
4920: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
4930: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
4940: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
4950: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
4960: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
4970: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
4980: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
4990: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
49a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
49b0: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
49c0: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
49d0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
49e0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
49f0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
4a00: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
4a10: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
4a20: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
4a30: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
4a40: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
4a50: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
4a60: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
4a70: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
4a80: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54  al.bReserved = T
4a90: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
4aa0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
4ab0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
4ac0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
4ad0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
4ae0: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
4af0: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
4b00: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e  tation of the Un
4b10: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20  lockFile API of 
4b20: 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69 6e 63  windows for winc
4b30: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  e.*/.static BOOL
4b40: 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
4b50: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
4b60: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
4b70: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
4b80: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
4b90: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
4ba0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
4bb0: 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
4bc0: 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
4bd0: 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
4be0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
4bf0: 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
4c00: 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
4c10: 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
4c20: 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
4c30: 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
4c40: 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
4c50: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
4c60: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
4c70: 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
4c80: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
4c90: 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
4ca0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
4cb0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
4cc0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
4cd0: 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
4ce0: 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
4cf0: 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
4d00: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
4d10: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
4d20: 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
4d30: 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
4d40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
4d50: 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
4d60: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
4d70: 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
4d80: 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
4d90: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
4da0: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
4db0: 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
4dc0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
4dd0: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
4de0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
4df0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
4e00: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
4e10: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
4e20: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
4e30: 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
4e40: 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
4e50: 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
4e60: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
4e70: 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
4e80: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
4e90: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
4ea0: 29 53 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20  )SHARED_SIZE || 
4eb0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
4ec0: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
4ed0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
4ee0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
4ef0: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
4f00: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
4f10: 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
4f20: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
4f30: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
4f40: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
4f50: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
4f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
4f70: 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
4f80: 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
4f90: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
4fa0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
4fb0: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
4fc0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
4fd0: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
4fe0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
4ff0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
5000: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
5010: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
5020: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
5030: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
5040: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
5050: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
5060: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
5070: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
5080: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
5090: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
50a0: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
50b0: 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
50c0: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
50d0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
50e0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
50f0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
5100: 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20  served) {.      
5110: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
5120: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
5130: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
5140: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
5150: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
5160: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
5170: 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
5180: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
5190: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
51a0: 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
51b0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
51c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
51d0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
51e0: 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66 6f 72  I of windows for
51f0: 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63   wince.*/.static
5200: 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
5210: 69 6c 65 45 78 28 0a 20 20 48 41 4e 44 4c 45 20  ileEx(.  HANDLE 
5220: 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44  *phFile,.  DWORD
5230: 20 64 77 46 6c 61 67 73 2c 0a 20 20 44 57 4f 52   dwFlags,.  DWOR
5240: 44 20 64 77 52 65 73 65 72 76 65 64 2c 0a 20 20  D dwReserved,.  
5250: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
5260: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20  ytesToLockLow,. 
5270: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
5280: 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 2c  BytesToLockHigh,
5290: 0a 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 20  .  LPOVERLAPPED 
52a0: 6c 70 4f 76 65 72 6c 61 70 70 65 64 0a 29 7b 0a  lpOverlapped.){.
52b0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
52c0: 45 52 28 64 77 52 65 73 65 72 76 65 64 29 3b 0a  ER(dwReserved);.
52d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
52e0: 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
52f0: 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  sToLockHigh);.. 
5300: 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65   /* If the calle
5310: 72 20 77 61 6e 74 73 20 61 20 73 68 61 72 65 64  r wants a shared
5320: 20 72 65 61 64 20 6c 6f 63 6b 2c 20 66 6f 72 77   read lock, forw
5330: 61 72 64 20 74 68 69 73 20 63 61 6c 6c 0a 20 20  ard this call.  
5340: 2a 2a 20 74 6f 20 77 69 6e 63 65 4c 6f 63 6b 46  ** to winceLockF
5350: 69 6c 65 20 2a 2f 0a 20 20 69 66 20 28 6c 70 4f  ile */.  if (lpO
5360: 76 65 72 6c 61 70 70 65 64 2d 3e 4f 66 66 73 65  verlapped->Offse
5370: 74 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  t == (DWORD)SHAR
5380: 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20  ED_FIRST &&.    
5390: 20 20 64 77 46 6c 61 67 73 20 3d 3d 20 31 20 26    dwFlags == 1 &
53a0: 26 0a 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f  &.      nNumberO
53b0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
53c0: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
53d0: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 72 65 74 75  _SIZE){.    retu
53e0: 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  rn winceLockFile
53f0: 28 70 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  (phFile, SHARED_
5400: 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
5410: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
5420: 4c 53 45 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  LSE;.}./*.** End
5430: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
5440: 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
5450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
54a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
54b0: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 2a 2a  S_WINCE */../***
54c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
54f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
5510: 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20  e next group of 
5520: 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65  routines impleme
5530: 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  nt the I/O metho
5540: 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ds specified.** 
5550: 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  by the sqlite3_i
5560: 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
5570: 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
5580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
55c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 6d 69  /../*.** Some mi
55d0: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
55e0: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
55f0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
5600: 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ef INVALID_SET_F
5610: 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65  ILE_POINTER.# de
5620: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54  fine INVALID_SET
5630: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28  _FILE_POINTER ((
5640: 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66  DWORD)-1).#endif
5650: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
5660: 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
5670: 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61  n of the file ha
5680: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
5690: 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
56a0: 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20  ument to offset 
56b0: 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74  iOffset within t
56c0: 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  he file. If succ
56d0: 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30  essful, return 0
56e0: 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
56f0: 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74   set pFile->last
5700: 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e  Errno and return
5710: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
5720: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69 6e  atic int seekWin
5730: 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  File(winFile *pF
5740: 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  ile, sqlite3_int
5750: 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 20 20 4c  64 iOffset){.  L
5760: 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20  ONG upperBits;  
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5780: 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62  * Most sig. 32 b
5790: 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
57a0: 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65  t */.  LONG lowe
57b0: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
57c0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20         /* Least 
57d0: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
57e0: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
57f0: 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20  DWORD dwRet;    
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
5820: 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
5830: 74 65 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65  ter() */..  uppe
5840: 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
5850: 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
5860: 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
5870: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
5880: 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
5890: 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
58a0: 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
58b0: 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
58c0: 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
58d0: 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20  s a dword .  ** 
58e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
58f0: 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20  ower 32-bits of 
5900: 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66  the new file-off
5910: 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66  set. Or, if it f
5920: 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65  ails,.  ** it re
5930: 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45  turns INVALID_SE
5940: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20  T_FILE_POINTER. 
5950: 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e  However accordin
5960: 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a  g to MSDN, .  **
5970: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
5980: 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c  E_POINTER may al
5990: 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65  so be a valid ne
59a0: 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20  w offset. So to 
59b0: 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
59c0: 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
59d0: 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
59e0: 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73  cured, it is als
59f0: 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63  o necessary to c
5a00: 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73  all .  ** GetLas
5a10: 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
5a20: 20 64 77 52 65 74 20 3d 20 53 65 74 46 69 6c 65   dwRet = SetFile
5a30: 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68  Pointer(pFile->h
5a40: 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70  , lowerBits, &up
5a50: 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45  perBits, FILE_BE
5a60: 47 49 4e 29 3b 0a 20 20 69 66 28 20 28 64 77 52  GIN);.  if( (dwR
5a70: 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  et==INVALID_SET_
5a80: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26 20  FILE_POINTER && 
5a90: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
5aa0: 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20  NO_ERROR) ){.   
5ab0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
5ac0: 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  o = GetLastError
5ad0: 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
5ae0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
5af0: 5f 53 45 45 4b 2c 20 22 73 65 65 6b 57 69 6e 46  _SEEK, "seekWinF
5b00: 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ile", pFile->zPa
5b10: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  th);.    return 
5b20: 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  1;.  }..  return
5b30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
5b40: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
5b50: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
5b60: 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
5b70: 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
5b80: 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
5b90: 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
5ba0: 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
5bb0: 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
5bc0: 62 75 74 20 77 69 6e 64 6f 77 73 20 69 73 20 6e  but windows is n
5bd0: 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
5be0: 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
5bf0: 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
5c00: 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
5c10: 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
5c20: 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
5c30: 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
5c40: 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
5c50: 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
5c60: 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
5c70: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
5c80: 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
5c90: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
5ca0: 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
5cb0: 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
5cc0: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
5cd0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
5ce0: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
5cf0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
5d00: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
5d10: 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
5d20: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
5d30: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
5d40: 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
5d50: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
5d60: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
5d70: 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  pShm==0 );.  OST
5d80: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
5d90: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
5da0: 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 43    do{.    rc = C
5db0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
5dc0: 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
5dd0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
5de0: 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
5df0: 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
5e00: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
5e10: 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
5e20: 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
5e30: 53 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  Sleep(100), 1) )
5e40: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
5e50: 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49  WINCE.#define WI
5e60: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
5e70: 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44  EMPTS 3.  winceD
5e80: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
5e90: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
5ea0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
5eb0: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
5ec0: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
5ed0: 20 20 20 20 20 20 20 20 20 44 65 6c 65 74 65 46           DeleteF
5ee0: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
5ef0: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
5f00: 20 20 20 20 20 20 20 26 26 20 47 65 74 46 69 6c         && GetFil
5f10: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
5f20: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
5f30: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
5f40: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
5f50: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
5f60: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
5f70: 29 7b 0a 20 20 20 20 20 20 20 53 6c 65 65 70 28  ){.       Sleep(
5f80: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
5f90: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
5fa0: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
5fb0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 70 46     }.    free(pF
5fc0: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
5fd0: 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ose);.  }.#endif
5fe0: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
5ff0: 53 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46 69  SE %d %s\n", pFi
6000: 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
6010: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
6020: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
6030: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
6040: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
6050: 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72        : winLogEr
6060: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
6070: 5f 43 4c 4f 53 45 2c 20 22 77 69 6e 43 6c 6f 73  _CLOSE, "winClos
6080: 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
6090: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
60a0: 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
60b0: 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
60c0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
60d0: 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
60e0: 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
60f0: 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
6100: 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
6110: 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
6120: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
6130: 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
6140: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
6150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
6160: 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
6170: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6190: 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
61a0: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
61b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
61e0: 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
61f0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
6200: 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
6210: 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
6220: 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
6230: 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
6240: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
6250: 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64  d;  /* file hand
6260: 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52  le */.  DWORD nR
6270: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
6280: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6290: 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
62a0: 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69  lly read from fi
62b0: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
62c0: 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75   id!=0 );.  Simu
62d0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
62e0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
62f0: 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45  READ);.  OSTRACE
6300: 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d  (("READ %d lock=
6310: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
6320: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
6330: 29 29 3b 0a 0a 20 20 69 66 28 20 73 65 65 6b 57  ));..  if( seekW
6340: 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  inFile(pFile, of
6350: 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65 74  fset) ){.    ret
6360: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
6370: 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 61 64  .  }.  if( !Read
6380: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
6390: 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64  Buf, amt, &nRead
63a0: 2c 20 30 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  , 0) ){.    pFil
63b0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
63c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
63d0: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
63e0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
63f0: 52 52 5f 52 45 41 44 2c 20 22 77 69 6e 52 65 61  RR_READ, "winRea
6400: 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
6410: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  );.  }.  if( nRe
6420: 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
6430: 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
6440: 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
6450: 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
6460: 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
6470: 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
6480: 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
6490: 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72  mt-nRead);.    r
64a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
64b0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
64c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
64d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64e0: 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
64f0: 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
6500: 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
6510: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
6520: 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
6530: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
6540: 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
6550: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
6560: 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
6570: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
6580: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
6590: 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
65a0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
65b0: 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
65c0: 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
65d0: 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
65e0: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
6610: 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
6620: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
6630: 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
6640: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
6650: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
6660: 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
6670: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
66a0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
66b0: 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
66c0: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
66d0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
66e0: 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
66f0: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
6700: 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
6710: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
6720: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
6730: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
6740: 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d  RR_WRITE);.  Sim
6750: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
6760: 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
6770: 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41  _FULL);..  OSTRA
6780: 43 45 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f  CE(("WRITE %d lo
6790: 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
67a0: 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
67b0: 79 70 65 29 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ype));..  rc = s
67c0: 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65  eekWinFile(pFile
67d0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
67e0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38   rc==0 ){.    u8
67f0: 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70   *aRem = (u8 *)p
6800: 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  Buf;        /* D
6810: 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72  ata yet to be wr
6820: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
6830: 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20   nRem = amt;    
6840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6850: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65  mber of bytes ye
6860: 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
6870: 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72  */.    DWORD nWr
6880: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
6890: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72       /* Bytes wr
68a0: 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72  itten by each Wr
68b0: 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a  iteFile() call *
68c0: 2f 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52  /..    while( nR
68d0: 65 6d 3e 30 20 26 26 20 57 72 69 74 65 46 69 6c  em>0 && WriteFil
68e0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
68f0: 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
6900: 20 30 29 20 26 26 20 6e 57 72 69 74 65 3e 30 20   0) && nWrite>0 
6910: 29 7b 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  ){.      aRem +=
6920: 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
6930: 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
6940: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
6950: 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
6960: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
6970: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
6980: 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
6990: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
69a0: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
69b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
69c0: 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
69d0: 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
69e0: 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
69f0: 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
6a00: 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
6a10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6a20: 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
6a30: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
6a40: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
6a50: 52 5f 57 52 49 54 45 2c 20 22 77 69 6e 57 72 69  R_WRITE, "winWri
6a60: 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
6a70: 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
6a80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6a90: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
6aa0: 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
6ab0: 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
6ac0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
6ad0: 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
6ae0: 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
6af0: 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
6b00: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
6b10: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
6b20: 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
6b30: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
6b40: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
6b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6b60: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72   Return code for
6b70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
6b80: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  /..  assert( pFi
6b90: 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  le );..  OSTRACE
6ba0: 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25  (("TRUNCATE %d %
6bb0: 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  lld\n", pFile->h
6bc0: 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69 6d  , nByte));.  Sim
6bd0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
6be0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
6bf0: 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f  _TRUNCATE);..  /
6c00: 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
6c10: 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
6c20: 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
6c30: 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
6c40: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
6c50: 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
6c60: 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
6c70: 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
6c80: 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
6c90: 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
6ca0: 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
6cb0: 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
6cc0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
6cd0: 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
6ce0: 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
6cf0: 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 29 7b  File->szChunk ){
6d00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
6d10: 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
6d20: 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
6d30: 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
6d40: 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
6d50: 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46  ..  /* SetEndOfF
6d60: 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f  ile() returns no
6d70: 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63  n-zero when succ
6d80: 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20  essful, or zero 
6d90: 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a  when it fails. *
6da0: 2f 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46  /.  if( seekWinF
6db0: 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
6dc0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  ) ){.    rc = wi
6dd0: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
6de0: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
6df0: 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c   "winTruncate1",
6e00: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
6e10: 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 53    }else if( 0==S
6e20: 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c  etEndOfFile(pFil
6e30: 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46 69  e->h) ){.    pFi
6e40: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
6e50: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
6e60: 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
6e70: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
6e80: 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 77 69 6e  R_TRUNCATE, "win
6e90: 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c  Truncate2", pFil
6ea0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
6eb0: 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
6ec0: 43 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73 5c  CATE %d %lld %s\
6ed0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  n", pFile->h, nB
6ee0: 79 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c 65  yte, rc ? "faile
6ef0: 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
6f00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
6f10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
6f20: 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
6f30: 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
6f40: 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
6f50: 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
6f60: 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
6f70: 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
6f80: 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
6f90: 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
6fa0: 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
6fb0: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
6fc0: 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
6fd0: 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
6fe0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
6ff0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
7000: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
7010: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
7020: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
7030: 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
7040: 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
7050: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7060: 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 20 21  nt flags){.#if !
7070: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
7080: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
7090: 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 64  TE_NO_SYNC) || d
70a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
70b0: 42 55 47 29 0a 20 20 77 69 6e 46 69 6c 65 20 2a  BUG).  winFile *
70c0: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
70d0: 2a 29 69 64 3b 0a 20 20 42 4f 4f 4c 20 72 63 3b  *)id;.  BOOL rc;
70e0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
70f0: 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
7100: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
7110: 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
7120: 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
7130: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
7140: 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
7150: 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
7160: 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
7170: 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
7180: 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
7190: 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
71a0: 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
71b0: 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ..  OSTRACE(("SY
71c0: 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  NC %d lock=%d\n"
71d0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
71e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
71f0: 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
7200: 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
7210: 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
7220: 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
7230: 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
7240: 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
7250: 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
7260: 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
7270: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
7280: 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
7290: 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
72a0: 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23  QLITE_FULL );..#
72b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45  ifndef SQLITE_TE
72c0: 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
72d0: 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65  METER(flags);.#e
72e0: 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73  lse.  if( (flags
72f0: 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
7300: 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
7310: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
7320: 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
7330: 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
7340: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
7350: 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
7360: 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
7370: 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
7380: 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
7390: 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
73a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
73b0: 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75 72 6e  NO_SYNC.  return
73c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
73d0: 65 0a 20 20 72 63 20 3d 20 46 6c 75 73 68 46 69  e.  rc = FlushFi
73e0: 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d  leBuffers(pFile-
73f0: 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  >h);.  SimulateI
7400: 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45  OError( rc=FALSE
7410: 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
7420: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7430: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
7440: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
7450: 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
7460: 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  or();.    return
7470: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
7480: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
7490: 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
74a0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
74b0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
74c0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
74d0: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
74e0: 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
74f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
7500: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
7510: 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
7520: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
7530: 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
7540: 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f 77 65 72  s;.  DWORD lower
7550: 42 69 74 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20  Bits;.  winFile 
7560: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
7570: 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 65  e*)id;.  DWORD e
7580: 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rror;..  assert(
7590: 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75   id!=0 );.  Simu
75a0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
75b0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
75c0: 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77 65 72 42  FSTAT);.  lowerB
75d0: 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53 69 7a  its = GetFileSiz
75e0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
75f0: 65 72 42 69 74 73 29 3b 0a 20 20 69 66 28 20 20  erBits);.  if(  
7600: 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
7610: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
7620: 29 0a 20 20 20 20 20 26 26 20 28 28 65 72 72 6f  ).     && ((erro
7630: 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72  r = GetLastError
7640: 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 29  ()) != NO_ERROR)
7650: 20 29 0a 20 20 7b 0a 20 20 20 20 70 46 69 6c 65   ).  {.    pFile
7660: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
7670: 72 6f 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ror;.    return 
7680: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
7690: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
76a0: 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
76b0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
76c0: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28  }.  *pSize = (((
76d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
76e0: 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
76f0: 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74  lowerBits;.  ret
7700: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7710: 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
7720: 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
7730: 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
7740: 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
7750: 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
7760: 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
7770: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
7780: 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
7790: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
77a0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
77b0: 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65 72  Acquire a reader
77c0: 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72   lock..** Differ
77d0: 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73  ent API routines
77e0: 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65   are called depe
77f0: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
7800: 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20   or not this.** 
7810: 69 73 20 57 69 6e 39 35 20 6f 72 20 57 69 6e 4e  is Win95 or WinN
7820: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
7830: 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e   getReadLock(win
7840: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
7850: 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20 69  int res;.  if( i
7860: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
7870: 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
7880: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
7890: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
78a0: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
78b0: 68 20 3d 20 30 3b 0a 20 20 20 20 6f 76 6c 70 2e  h = 0;.    ovlp.
78c0: 68 45 76 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  hEvent = 0;.    
78d0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78  res = LockFileEx
78e0: 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 46  (pFile->h, LOCKF
78f0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
7900: 54 45 4c 59 2c 0a 20 20 20 20 20 20 20 20 20 20  TELY,.          
7910: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 53 48             0, SH
7920: 41 52 45 44 5f 53 49 5a 45 2c 20 30 2c 20 26 6f  ARED_SIZE, 0, &o
7930: 76 6c 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  vlp);./* isNT() 
7940: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
7950: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
7960: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
7970: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a  r executed. .*/.
7980: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7990: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
79a0: 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20      int lk;.    
79b0: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
79c0: 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26  ss(sizeof(lk), &
79d0: 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lk);.    pFile->
79e0: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
79f0: 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30   (short)((lk & 0
7a00: 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
7a10: 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20  ED_SIZE - 1));. 
7a20: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
7a30: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
7a40: 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e  ED_FIRST+pFile->
7a50: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
7a60: 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66  0, 1, 0);.#endif
7a70: 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 73 20 3d  .  }.  if( res =
7a80: 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
7a90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
7aa0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
7ab0: 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20    /* No need to 
7ac0: 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f  log a failure to
7ad0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72   lock */.  }.  r
7ae0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
7af0: 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c  .** Undo a readl
7b00: 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ock.*/.static in
7b10: 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  t unlockReadLock
7b20: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
7b30: 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  {.  int res;.  i
7b40: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
7b50: 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c   res = UnlockFil
7b60: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  e(pFile->h, SHAR
7b70: 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
7b80: 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a  RED_SIZE, 0);./*
7b90: 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20   isNT() is 1 if 
7ba0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
7bb0: 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65  =1, so this else
7bc0: 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74   is never execut
7bd0: 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ed. .*/.#if SQLI
7be0: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
7bf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20   }else{.    res 
7c00: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69  = UnlockFile(pFi
7c10: 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
7c20: 52 53 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61  RST + pFile->sha
7c30: 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
7c40: 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  1, 0);.#endif.  
7c50: 7d 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26  }.  if( res==0 &
7c60: 26 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  & GetLastError()
7c70: 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b  !=ERROR_NOT_LOCK
7c80: 45 44 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ED ){.    pFile-
7c90: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74  >lastErrno = Get
7ca0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
7cb0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
7cc0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
7cd0: 2c 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  , "unlockReadLoc
7ce0: 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
7cf0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7d00: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  res;.}../*.** Lo
7d10: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
7d20: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
7d30: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
7d40: 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a   locktype - one.
7d50: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
7d60: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
7d70: 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
7d80: 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
7d90: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
7da0: 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
7db0: 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
7dc0: 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
7dd0: 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
7de0: 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
7df0: 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
7e00: 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
7e10: 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
7e20: 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
7e30: 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
7e40: 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
7e50: 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
7e60: 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
7e70: 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
7e80: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
7e90: 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
7ea0: 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
7eb0: 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
7ec0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
7ed0: 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
7ee0: 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
7ef0: 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
7f00: 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
7f10: 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
7f20: 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
7f30: 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
7f40: 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
7f50: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
7f60: 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
7f70: 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
7f80: 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
7f90: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
7fa0: 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
7fb0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
7fc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
7fd0: 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20  l only increase 
7fe0: 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e  a lock.  The win
7ff0: 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  Unlock() routine
8000: 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c  .** erases all l
8010: 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64  ocks at once and
8020: 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65   returns us imme
8030: 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69  diately to locki
8040: 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49  ng level 0..** I
8050: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
8060: 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c  e to lower the l
8070: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65  ocking level one
8080: 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e   step at a time.
8090: 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f    You.** must go
80a0: 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63   straight to loc
80b0: 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f  king level 0..*/
80c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
80d0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
80e0: 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79   *id, int lockty
80f0: 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pe){.  int rc = 
8100: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
8110: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
8120: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
8130: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20  .  int res = 1; 
8140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
8150: 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f 77 73  ult of a windows
8160: 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20   lock call */.  
8170: 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  int newLocktype;
8180: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46         /* Set pF
8190: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f  ile->locktype to
81a0: 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f   this value befo
81b0: 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20  re exiting */.  
81c0: 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  int gotPendingLo
81d0: 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69  ck = 0;/* True i
81e0: 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20  f we acquired a 
81f0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69  PENDING lock thi
8200: 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46  s time */.  winF
8210: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
8220: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f  nFile*)id;.  DWO
8230: 52 44 20 65 72 72 6f 72 20 3d 20 4e 4f 5f 45 52  RD error = NO_ER
8240: 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ROR;..  assert( 
8250: 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  id!=0 );.  OSTRA
8260: 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64 20  CE(("LOCK %d %d 
8270: 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  was %d(%d)\n",. 
8280: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
8290: 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46  >h, locktype, pF
82a0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
82b0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
82c0: 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  Byte));..  /* If
82d0: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
82e0: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
82f0: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
8300: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
8310: 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
8320: 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
8330: 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
8340: 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
8350: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
8360: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
8370: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
8380: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
8390: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
83a0: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
83b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
83c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
83d0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
83e0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
83f0: 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
8400: 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
8410: 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
8420: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
8430: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
8440: 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
8450: 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
8460: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
8470: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
8480: 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
8490: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
84a0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
84b0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
84c0: 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
84d0: 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
84e0: 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
84f0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
8500: 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
8510: 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
8520: 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
8530: 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
8540: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
8550: 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
8560: 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
8570: 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
8580: 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
8590: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
85a0: 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
85b0: 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
85c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
85d0: 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
85e0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
85f0: 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
8600: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
8610: 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
8620: 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
8630: 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e  LockFile(pFile->
8640: 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
8650: 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
8660: 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
8670: 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
8680: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
8690: 54 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  The pending lock
86a0: 20 6d 69 67 68 74 20 62 65 0a 20 20 20 20 20 20   might be.      
86b0: 2a 2a 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ** held by anoth
86c0: 65 72 20 72 65 61 64 65 72 20 70 72 6f 63 65 73  er reader proces
86d0: 73 20 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61  s who will relea
86e0: 73 65 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c  se it momentaril
86f0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
8700: 20 20 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c    OSTRACE(("coul
8710: 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44  d not get a PEND
8720: 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64  ING lock. cnt=%d
8730: 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20  \n", cnt));.    
8740: 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20    Sleep(1);.    
8750: 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
8760: 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
8770: 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
8780: 20 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73    error = GetLas
8790: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
87a0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
87b0: 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
87c0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
87d0: 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
87e0: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
87f0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
8800: 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
8810: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74  );.    res = get
8820: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
8830: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
8840: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
8850: 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
8860: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8870: 20 20 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73    error = GetLas
8880: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
8890: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
88a0: 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
88b0: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
88c0: 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
88d0: 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
88e0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
88f0: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
8900: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
8910: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46  es = LockFile(pF
8920: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
8930: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
8940: 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
8950: 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
8960: 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  e = RESERVED_LOC
8970: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
8980: 20 20 20 20 65 72 72 6f 72 20 3d 20 47 65 74 4c      error = GetL
8990: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
89a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
89b0: 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
89c0: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
89d0: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
89e0: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
89f0: 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  .    newLocktype
8a00: 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
8a10: 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
8a20: 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ock = 0;.  }..  
8a30: 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
8a40: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a  CLUSIVE lock.  *
8a50: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
8a60: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
8a70: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
8a80: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
8a90: 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  cktype>=SHARED_L
8aa0: 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
8ab0: 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
8ac0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52  pFile);.    OSTR
8ad0: 41 43 45 28 28 22 75 6e 72 65 61 64 6c 6f 63 6b  ACE(("unreadlock
8ae0: 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73 29 29 3b   = %d\n", res));
8af0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
8b00: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
8b10: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
8b20: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
8b30: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
8b40: 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
8b50: 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
8b60: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
8b70: 20 20 20 20 65 72 72 6f 72 20 3d 20 47 65 74 4c      error = GetL
8b80: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
8b90: 20 20 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f    OSTRACE(("erro
8ba0: 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20  r-code = %d\n", 
8bb0: 65 72 72 6f 72 29 29 3b 0a 20 20 20 20 20 20 67  error));.      g
8bc0: 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
8bd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
8be0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
8bf0: 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
8c00: 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
8c10: 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
8c20: 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
8c30: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
8c40: 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
8c50: 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
8c60: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
8c70: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
8c80: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
8c90: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
8ca0: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
8cb0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
8cc0: 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
8cd0: 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
8ce0: 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
8cf0: 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
8d00: 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
8d10: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
8d20: 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
8d30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
8d40: 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  se{.    OSTRACE(
8d50: 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64  ("LOCK FAILED %d
8d60: 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62   trying for %d b
8d70: 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46  ut got %d\n", pF
8d80: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
8d90: 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77     locktype, new
8da0: 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  Locktype));.    
8db0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
8dc0: 20 3d 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 63   = error;.    rc
8dd0: 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
8de0: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
8df0: 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c  ktype = (u8)newL
8e00: 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72  ocktype;.  retur
8e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
8e20: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
8e30: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
8e40: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
8e50: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
8e60: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
8e70: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
8e80: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
8e90: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
8ea0: 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
8eb0: 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
8ec0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
8ed0: 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
8ee0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
8ef0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
8f00: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
8f10: 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a   rc;.  winFile *
8f20: 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
8f30: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
8f40: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
8f50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
8f60: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
8f70: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69   );..  assert( i
8f80: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
8f90: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
8fa0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
8fb0: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
8fc0: 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
8fd0: 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f  R-LOCK %d %d (lo
8fe0: 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  cal)\n", pFile->
8ff0: 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  h, rc));.  }else
9000: 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46  {.    rc = LockF
9010: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
9020: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
9030: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
9040: 63 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63  c ){.      Unloc
9050: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
9060: 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
9070: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
9080: 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
9090: 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
90a0: 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72  WR-LOCK %d %d (r
90b0: 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65  emote)\n", pFile
90c0: 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20  ->h, rc));.  }. 
90d0: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
90e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
90f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
9100: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
9110: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
9120: 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
9130: 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
9140: 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
9150: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
9160: 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
9170: 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
9180: 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
9190: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
91a0: 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
91b0: 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
91c0: 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
91d0: 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
91e0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
91f0: 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
9200: 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
9210: 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
9220: 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
9230: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
9240: 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
9250: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
9260: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
9270: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
9280: 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
9290: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
92a0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
92b0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
92c0: 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
92d0: 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
92e0: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
92f0: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
9300: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
9310: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
9320: 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
9330: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
9340: 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
9350: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
9360: 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61  LOCK %d to %d wa
9370: 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69  s %d(%d)\n", pFi
9380: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
9390: 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
93a0: 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
93b0: 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
93c0: 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
93d0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
93e0: 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
93f0: 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
9400: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   UnlockFile(pFil
9410: 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
9420: 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
9430: 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
9440: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
9450: 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61  _LOCK && !getRea
9460: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a  dLock(pFile) ){.
9470: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
9480: 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
9490: 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c  n.  We should al
94a0: 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a  ways be able to.
94b0: 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69        ** reacqui
94c0: 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
94d0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
94e0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
94f0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
9500: 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
9510: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
9520: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
9530: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9540: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
9550: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
9560: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
9570: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
9580: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
9590: 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
95a0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c  _LOCK ){.    unl
95b0: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
95c0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  e);.  }.  if( ty
95d0: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
95e0: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
95f0: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
9600: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
9610: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
9620: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
9630: 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74  )locktype;.  ret
9640: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9650: 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65   Control and que
9660: 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  ry of the open f
9670: 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
9680: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
9690: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
96a0: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
96b0: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
96c0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
96d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
96e0: 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
96f0: 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
9700: 70 41 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65  pArg = ((winFile
9710: 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
9720: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9730: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
9740: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
9750: 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
9760: 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
9770: 20 28 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a   (int)((winFile*
9780: 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  )id)->lastErrno;
9790: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
97a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
97b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
97c0: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
97d0: 20 7b 0a 20 20 20 20 20 20 28 28 77 69 6e 46 69   {.      ((winFi
97e0: 6c 65 2a 29 69 64 29 2d 3e 73 7a 43 68 75 6e 6b  le*)id)->szChunk
97f0: 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
9800: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9810: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
9820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
9830: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
9840: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9850: 69 6e 74 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c  int64 sz = *(sql
9860: 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
9870: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
9880: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
9890: 3b 0a 20 20 20 20 20 20 77 69 6e 54 72 75 6e 63  ;.      winTrunc
98a0: 61 74 65 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20  ate(id, sz);.   
98b0: 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
98c0: 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
98d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
98e0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
98f0: 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
9900: 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44 3a 20 7b  _SYNC_OMITTED: {
9910: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9920: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
9930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
9940: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
9950: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
9960: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
9970: 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
9980: 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
9990: 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
99a0: 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
99b0: 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
99c0: 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
99d0: 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
99e0: 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
99f0: 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
9a00: 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
9a10: 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
9a20: 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
9a30: 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
9a40: 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
9a50: 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
9a60: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
9a70: 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
9a80: 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
9a90: 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
9aa0: 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
9ab0: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
9ac0: 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
9ad0: 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
9ae0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
9af0: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
9b00: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 61 73  _file *id){.  as
9b10: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
9b20: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 28 28   return (int)(((
9b30: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 73 65  winFile*)id)->se
9b40: 63 74 6f 72 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  ctorSize);.}../*
9b50: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63  .** Return a vec
9b60: 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68  tor of device ch
9b70: 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a  aracteristics..*
9b80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9b90: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
9ba0: 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
9bb0: 6c 65 20 2a 69 64 29 7b 0a 20 20 55 4e 55 53 45  le *id){.  UNUSE
9bc0: 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
9bd0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9be0: 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
9bf0: 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 3b 0a 7d 0a  LE_WHEN_OPEN;.}.
9c00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9c10: 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a  OMIT_WAL../* .**
9c20: 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e   Windows will on
9c30: 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74  ly let you creat
9c40: 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70  e file view mapp
9c50: 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63  ings.** on alloc
9c60: 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75  ation size granu
9c70: 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65  larity boundarie
9c80: 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c  s..** During sql
9c90: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
9ca0: 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d  e do a GetSystem
9cb0: 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74  Info().** to get
9cc0: 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79   the granularity
9cd0: 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d   size..*/.SYSTEM
9ce0: 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f  _INFO winSysInfo
9cf0: 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  ;../*.** Helper 
9d00: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
9d10: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
9d20: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
9d30: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
9d40: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
9d50: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
9d60: 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  winLockInfo obje
9d70: 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  cts used by .** 
9d80: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
9d90: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  f which may be s
9da0: 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
9db0: 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
9dc0: 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d   Function winShm
9dd0: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
9de0: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
9df0: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
9e00: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
9e10: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
9e20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
9e30: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
9e40: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
9e50: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
9e60: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e  e.g..**.**   win
9e70: 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  ShmEnterMutex().
9e80: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77  **     assert( w
9e90: 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
9ea0: 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c   );.**   winShmL
9eb0: 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73  eaveMutex().*/.s
9ec0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
9ed0: 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  mEnterMutex(void
9ee0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
9ef0: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
9f00: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
9f10: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
9f20: 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
9f30: 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61  c void winShmLea
9f40: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
9f50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9f60: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
9f70: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9f80: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
9f90: 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
9fa0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
9fb0: 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65  c int winShmMute
9fc0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
9fd0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
9fe0: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
9ff0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a000: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a010: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
a020: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  if../*.** Object
a030: 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
a040: 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65  nt a single file
a050: 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70   opened and mmap
a060: 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a  ped to provide.*
a070: 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  * shared memory.
a080: 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20    When multiple 
a090: 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
a0a0: 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a  rence the same.*
a0b0: 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65  * log-summary, e
a0c0: 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69  ach thread has i
a0d0: 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f  ts own winFile o
a0e0: 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20  bject, but they 
a0f0: 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  all.** point to 
a100: 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
a110: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
a120: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a130: 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73  s, each.** log-s
a140: 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64  ummary is opened
a150: 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
a160: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69  rocess..**.** wi
a170: 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
a180: 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
a190: 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
a1a0: 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
a1b0: 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
a1c0: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
a1d0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
a1e0: 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
a1f0: 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20       nRef.**    
a200: 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54    pNext .**.** T
a210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
a220: 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
a230: 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
a240: 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
a250: 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
a260: 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
a270: 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69  .**.** Either wi
a280: 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  nShmNode.mutex m
a290: 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77  ust be held or w
a2a0: 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  inShmNode.nRef==
a2b0: 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d  0 and.** winShmM
a2c0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
a2d0: 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
a2e0: 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
a2f0: 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
a300: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
a310: 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  .**.*/.struct wi
a320: 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c  nShmNode {.  sql
a330: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
a340: 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
a350: 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
a360: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
a370: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
a380: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
a390: 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
a3a0: 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20  winFile hFile;  
a3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
a3c0: 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77  le handle from w
a3d0: 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74  inOpen */..  int
a3e0: 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
a3f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a400: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
a410: 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
a420: 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
a430: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
a440: 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
a450: 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  on */.  struct S
a460: 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48  hmRegion {.    H
a470: 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
a480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
a490: 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61  handle from Crea
a4a0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f  teFileMapping */
a4b0: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b  .    void *pMap;
a4c0: 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20  .  } *aRegion;. 
a4d0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
a4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
a4f0: 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
a500: 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
a510: 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69  /O error */..  i
a520: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
a530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a540: 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62  ber of winShm ob
a550: 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
a560: 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
a570: 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
a580: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69         /* All wi
a590: 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
a5a0: 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
a5b0: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
a5c0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
a5d0: 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66   Next in list of
a5e0: 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
a5f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65  objects */.#ifde
a600: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a610: 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
a620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a630: 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69  ext available wi
a640: 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  nShm.id value */
a650: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
a660: 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79  * A global array
a670: 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
a680: 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a  de objects..**.*
a690: 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65  * The winShmMute
a6a0: 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
a6b0: 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69  true while readi
a6c0: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
a6d0: 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  is list..*/.stat
a6e0: 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77  ic winShmNode *w
a6f0: 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
a700: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  0;../*.** Struct
a710: 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
a720: 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
a730: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
a740: 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
a750: 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
a760: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
a770: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
a780: 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
a790: 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
a7a0: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
a7b0: 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
a7c0: 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
a7d0: 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e  er:.**.**    win
a7e0: 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20  Shm.pShmNode.** 
a7f0: 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a     winShm.id.**.
a800: 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
a810: 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
a820: 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e  te.  The winShm.
a830: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
a840: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
a850: 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
a860: 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
a870: 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
a880: 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53   winShm {.  winS
a890: 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
a8a0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  ;      /* The un
a8b0: 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e  derlying winShmN
a8c0: 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
a8d0: 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  winShm *pNext;  
a8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
a8f0: 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74  xt winShm with t
a900: 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f  he same winShmNo
a910: 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
a920: 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
a930: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
a940: 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d  lding the winShm
a950: 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
a960: 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
a970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
a980: 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
a990: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
a9a0: 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
a9b0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
a9c0: 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
a9d0: 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
a9e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a9f0: 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
aa10: 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
aa20: 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69  tion with its wi
aa30: 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  nShmNode */.#end
aa40: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
aa50: 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
aa60: 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
aa70: 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20  ne WIN_SHM_BASE 
aa80: 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
aa90: 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
aaa0: 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
aab0: 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
aac0: 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20   WIN_SHM_DMS    
aad0: 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51  (WIN_SHM_BASE+SQ
aae0: 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
aaf0: 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
ab00: 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
ab10: 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ly advisory lock
ab20: 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65  s for all n byte
ab30: 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f  s beginning at o
ab40: 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  fst..*/.#define 
ab50: 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64  _SHM_UNLCK  1.#d
ab60: 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b  efine _SHM_RDLCK
ab70: 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    2.#define _SHM
ab80: 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
ab90: 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
aba0: 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
abb0: 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
abc0: 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
abd0: 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
abe0: 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
abf0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
ac00: 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f  pe,         /* _
ac10: 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f  SHM_UNLCK, _SHM_
ac20: 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57  RDLCK, or _SHM_W
ac30: 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
ac40: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
ac50: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
ac60: 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
ac70: 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
ac80: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
ac90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
aca0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
acb0: 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
acc0: 0a 29 7b 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  .){.  OVERLAPPED
acd0: 20 6f 76 6c 70 3b 0a 20 20 44 57 4f 52 44 20 64   ovlp;.  DWORD d
ace0: 77 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63  wFlags;.  int rc
acf0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ad00: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
ad10: 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
ad20: 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
ad30: 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
ad40: 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
ad50: 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
ad60: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
ad70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ad80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
ad90: 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
ada0: 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
adb0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
adc0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
add0: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 64 77 46  ameters */.  dwF
ade0: 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
adf0: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
ae00: 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  ;.  if( lockType
ae10: 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29   == _SHM_WRLCK )
ae20: 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b   dwFlags |= LOCK
ae30: 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
ae40: 4f 43 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  OCK;..  memset(&
ae50: 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
ae60: 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
ae70: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66  ovlp.Offset = of
ae80: 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  st;..  /* Releas
ae90: 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
aea0: 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
aeb0: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
aec0: 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b  e==_SHM_UNLCK ){
aed0: 0a 20 20 20 20 72 63 20 3d 20 55 6e 6c 6f 63 6b  .    rc = Unlock
aee0: 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 46  FileEx(pFile->hF
aef0: 69 6c 65 2e 68 2c 20 30 2c 20 6e 42 79 74 65 2c  ile.h, 0, nByte,
af00: 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65   0, &ovlp);.  }e
af10: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 4c 6f  lse{.    rc = Lo
af20: 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d 3e  ckFileEx(pFile->
af30: 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73  hFile.h, dwFlags
af40: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20 26  , 0, nByte, 0, &
af50: 6f 76 6c 70 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ovlp);.  }.  .  
af60: 69 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20  if( rc!= 0 ){.  
af70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
af80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
af90: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
afa0: 3d 20 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  =  GetLastError(
afb0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
afc0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
afd0: 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
afe0: 43 4b 20 25 64 20 25 73 20 25 73 20 30 78 25 30  CK %d %s %s 0x%0
aff0: 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  8lx\n", .       
b000: 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65      pFile->hFile
b010: 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72  .h,.           r
b020: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
b030: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 2c 0a  ok" : "failed",.
b040: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 54             lockT
b050: 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
b060: 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  ? "UnlockFileEx"
b070: 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   : "LockFileEx",
b080: 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
b090: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a  e->lastErrno));.
b0a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b0b0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
b0c0: 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
b0d0: 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
b0e0: 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
b0f0: 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
b100: 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
b110: 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
b120: 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
b130: 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
b140: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
b150: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
b160: 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
b170: 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
b180: 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
b190: 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
b1a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
b1b0: 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
b1c0: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
b1d0: 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
b1e0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
b1f0: 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
b200: 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
b210: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
b220: 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
b230: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
b240: 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
b250: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
b260: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
b270: 3b 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20  ;.  BOOL bRc;.  
b280: 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
b290: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 70  texHeld() );.  p
b2a0: 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c  p = &winShmNodeL
b2b0: 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  ist;.  while( (p
b2c0: 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20   = *pp)!=0 ){.  
b2d0: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
b2e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
b2f0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
b300: 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75  tex ) sqlite3_mu
b310: 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
b320: 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  x);.      for(i=
b330: 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
b340: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 62   i++){.        b
b350: 52 63 20 3d 20 55 6e 6d 61 70 56 69 65 77 4f 66  Rc = UnmapViewOf
b360: 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  File(p->aRegion[
b370: 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].pMap);.      
b380: 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
b390: 50 55 52 47 45 20 70 69 64 2d 25 64 20 75 6e 6d  PURGE pid-%d unm
b3a0: 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c  ap region=%d %s\
b3b0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
b3c0: 20 20 20 20 20 28 69 6e 74 29 47 65 74 43 75 72       (int)GetCur
b3d0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
b3e0: 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
b3f0: 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20       bRc ? "ok" 
b400: 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
b410: 20 20 20 20 20 20 62 52 63 20 3d 20 43 6c 6f 73        bRc = Clos
b420: 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69  eHandle(p->aRegi
b430: 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20  on[i].hMap);.   
b440: 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
b450: 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20  HM-PURGE pid-%d 
b460: 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20  close region=%d 
b470: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
b480: 20 20 20 20 20 20 20 20 28 69 6e 74 29 47 65 74          (int)Get
b490: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
b4a0: 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  (), i,.         
b4b0: 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f          bRc ? "o
b4c0: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
b4d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b4e0: 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21 3d  f( p->hFile.h !=
b4f0: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
b500: 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20  VALUE ){.       
b510: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
b520: 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
b530: 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
b540: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
b550: 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  hFile);.        
b560: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
b570: 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
b580: 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65  }.      if( dele
b590: 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  teFlag ){.      
b5a0: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
b5b0: 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
b5c0: 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56      winDelete(pV
b5d0: 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65  fs, p->zFilename
b5e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 53 69  , 0);.        Si
b5f0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
b600: 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
b610: 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
b620: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
b630: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
b640: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
b650: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
b660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
b670: 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
b680: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b690: 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
b6a0: 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
b6b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
b6c0: 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
b6d0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
b6e0: 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
b6f0: 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
b700: 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
b710: 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
b720: 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
b730: 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
b740: 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
b750: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
b760: 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
b770: 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
b780: 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
b790: 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
b7a0: 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
b7b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
b7c0: 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
b7d0: 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
b7e0: 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
b7f0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
b800: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
b810: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
b820: 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
b830: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
b840: 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
b850: 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
b860: 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
b870: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
b8a0: 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
b8b0: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
b8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
b8d0: 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
b8e0: 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
b8f0: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b910: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
b920: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
b930: 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
b940: 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
b950: 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
b960: 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
b970: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
b980: 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
b990: 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
b9a0: 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
b9b0: 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
b9c0: 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
b9d0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
b9e0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
b9f0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
ba00: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
ba10: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
ba20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ba30: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  MEM;.  memset(p,
ba40: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
ba50: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
ba60: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64  e3Strlen30(pDbFd
ba70: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77  ->zPath);.  pNew
ba80: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
ba90: 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  c( sizeof(*pShmN
baa0: 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ode) + nName + 1
bab0: 35 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  5 );.  if( pNew=
bac0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
bad0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72  3_free(p);.    r
bae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
baf0: 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
bb00: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
bb10: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77  (*pNew));.  pNew
bb20: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
bb30: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
bb40: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
bb50: 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77  f(nName+15, pNew
bb60: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ->zFilename, "%s
bb70: 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
bb80: 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ath);.  sqlite3F
bb90: 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
bba0: 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a  ->zPath, pNew->z
bbb0: 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f  Filename); ..  /
bbc0: 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
bbd0: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
bbe0: 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
bbf0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
bc00: 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
bc10: 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
bc20: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
bc30: 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
bc40: 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
bc50: 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
bc60: 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
bc70: 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
bc80: 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
bc90: 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
bca0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
bcb0: 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
bcc0: 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
bcd0: 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
bce0: 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
bcf0: 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
bd00: 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
bd10: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
bd20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
bd30: 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
bd40: 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
bd50: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
bd60: 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
bd70: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
bd80: 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
bd90: 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f  else{.    pShmNo
bda0: 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  de = pNew;.    p
bdb0: 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77  New = 0;.    ((w
bdc0: 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f  inFile*)(&pShmNo
bdd0: 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d  de->hFile))->h =
bde0: 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
bdf0: 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e  VALUE;.    pShmN
be00: 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e  ode->pNext = win
be10: 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  ShmNodeList;.   
be20: 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
be30: 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20  = pShmNode;..   
be40: 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
be50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
be60: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
be70: 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
be80: 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
be90: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
bea0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
beb0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
bec0: 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
bed0: 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  ..    rc = winOp
bee0: 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a  en(pDbFd->pVfs,.
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
bf10: 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  name,           
bf20: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
bf30: 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
bf40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf50: 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
bf60: 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
bf70: 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  e,  /* File hand
bf80: 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20  le here */.     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
bfa0: 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51  TE_OPEN_WAL | SQ
bfb0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
bfc0: 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
bfd0: 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d 6f 64  N_CREATE, /* Mod
bfe0: 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20 20 20  e flags */.     
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
c000: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
c010: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 72  K!=rc ){.      r
c020: 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
c030: 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
c040: 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
c050: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
c060: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
c070: 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
c080: 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
c090: 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
c0a0: 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  .    ** If not, 
c0b0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
c0c0: 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
c0d0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
c0e0: 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
c0f0: 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
c100: 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_WRLCK, WIN_SHM
c110: 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
c120: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
c130: 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
c140: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
c150: 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
c160: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
c170: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c180: 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
c190: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
c1a0: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 77  OERR_SHMOPEN, "w
c1b0: 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
c1c0: 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
c1d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
c1e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c1f0: 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
c200: 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
c210: 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
c220: 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
c230: 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
c240: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
c250: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
c260: 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
c270: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
c280: 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
c290: 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
c2a0: 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
c2b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
c2c0: 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
c2d0: 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
c2e0: 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
c2f0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c300: 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
c310: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
c320: 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
c330: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
c340: 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
c350: 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  = p;.  winShmLea
c360: 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
c370: 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
c380: 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
c390: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
c3a0: 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
c3b0: 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
c3c0: 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  er of the winShm
c3d0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
c3e0: 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
c3f0: 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
c400: 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e   new (struct win
c410: 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
c420: 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
c430: 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
c440: 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
c450: 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
c460: 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
c470: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
c480: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
c490: 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
c4a0: 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
c4b0: 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
c4c0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
c4d0: 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
c4e0: 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
c4f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
c500: 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
c510: 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
c520: 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
c530: 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
c540: 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
c550: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c560: 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
c570: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
c580: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
c590: 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
c5a0: 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
c5b0: 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53  n_err:.  winShmS
c5c0: 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
c5d0: 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
c5e0: 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
c5f0: 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70  .  winShmPurge(p
c600: 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20  DbFd->pVfs, 0); 
c610: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
c620: 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65  l frees pShmNode
c630: 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
c640: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c660: 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68  e(pNew);.  winSh
c670: 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  mLeaveMutex();. 
c680: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c690: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
c6a0: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
c6b0: 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
c6c0: 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
c6d0: 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
c6e0: 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
c6f0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
c700: 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20  t winShmUnmap(. 
c710: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
c720: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
c730: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
c740: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
c750: 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
c760: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
c770: 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c   Delete after cl
c780: 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  osing if true */
c790: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
c7a0: 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44  DbFd;       /* D
c7b0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
c7c0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
c7d0: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  .  winShm *p;   
c7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c7f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
c800: 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e   closed */.  win
c810: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
c820: 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  e; /* The underl
c830: 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
c840: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  ry file */.  win
c850: 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
c860: 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
c870: 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
c880: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  onnections */.. 
c890: 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c   pDbFd = (winFil
c8a0: 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
c8b0: 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
c8c0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
c8d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
c8e0: 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
c8f0: 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  e;..  /* Remove 
c900: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
c910: 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
c920: 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
c930: 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
c940: 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
c950: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c960: 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
c970: 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
c980: 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
c990: 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
c9a0: 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
c9b0: 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
c9c0: 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
c9d0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
c9e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c9f0: 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
ca00: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
ca10: 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
ca20: 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
ca30: 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
ca40: 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
ca50: 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
ca60: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
ca70: 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
ca80: 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
ca90: 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
caa0: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
cab0: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
cac0: 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
cad0: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
cae0: 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
caf0: 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65  .    winShmPurge
cb00: 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65  (pDbFd->pVfs, de
cb10: 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20  leteFlag);.  }. 
cb20: 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
cb30: 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
cb40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cb50: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
cb60: 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
cb70: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
cb80: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
cb90: 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a  int winShmLock(.
cba0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
cbb0: 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
cbc0: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
cbd0: 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
cbe0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
cbf0: 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
cc00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
cc10: 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
cc20: 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
cc30: 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cc50: 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
cc60: 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
cc70: 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
cc80: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
cc90: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
cca0: 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
ccb0: 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
ccc0: 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
ccd0: 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f  le*)fd;        /
cce0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
ccf0: 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
cd00: 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
cd10: 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd30: 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
cd40: 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
cd50: 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b  */.  winShm *pX;
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
cd80: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
cd90: 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
cda0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
cdb0: 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
cdc0: 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
cdd0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdf0: 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
ce00: 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce20: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
ce30: 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
ce40: 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
ce50: 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
ce60: 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
ce70: 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
ce80: 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
ce90: 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
cea0: 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
ceb0: 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
cec0: 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
ced0: 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
cee0: 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
cef0: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
cf00: 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
cf10: 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
cf20: 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
cf30: 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
cf40: 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
cf50: 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
cf60: 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
cf70: 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
cf80: 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
cf90: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
cfa0: 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
cfb0: 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36  ;..  mask = (u16
cfc0: 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29  )((1U<<(ofst+n))
cfd0: 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a   - (1U<<ofst));.
cfe0: 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
cff0: 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
d000: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
d010: 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
d020: 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
d030: 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
d040: 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
d050: 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
d060: 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
d070: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
d080: 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
d090: 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
d0a0: 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
d0b0: 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
d0c0: 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
d0d0: 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
d0e0: 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
d0f0: 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
d100: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
d110: 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
d120: 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
d130: 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
d140: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
d150: 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
d160: 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
d170: 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
d180: 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
d190: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
d1a0: 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
d1b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
d1c0: 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
d1d0: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
d1e0: 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_UNLCK, ofst+W
d1f0: 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
d200: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d210: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
d220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d230: 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
d240: 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
d250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d260: 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
d270: 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
d280: 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
d290: 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
d2a0: 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
d2b0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
d2c0: 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
d2d0: 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
d2e0: 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
d2f0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
d300: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
d310: 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
d320: 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
d330: 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
d340: 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
d350: 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
d360: 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
d370: 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
d380: 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
d390: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
d3a0: 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
d3b0: 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
d3c0: 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
d3d0: 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
d3e0: 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
d3f0: 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
d400: 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
d410: 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
d420: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d430: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
d440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d450: 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
d460: 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
d470: 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
d480: 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
d490: 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
d4a0: 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
d4b0: 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
d4c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d4d0: 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
d4e0: 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
d4f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
d500: 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
d510: 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
d520: 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
d530: 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
d540: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
d550: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
d560: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
d570: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
d580: 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
d590: 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
d5a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d5b0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
d5c0: 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
d5d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
d5e0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
d5f0: 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
d600: 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
d610: 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
d620: 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
d630: 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
d640: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
d650: 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
d660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
d670: 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
d680: 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
d690: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
d6a0: 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
d6b0: 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
d6c0: 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
d6d0: 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
d6e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d6f0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
d700: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d710: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
d720: 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
d730: 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
d740: 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
d750: 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
d760: 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
d770: 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
d780: 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
d790: 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
d7a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d7b0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
d7c0: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
d7d0: 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
d7e0: 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  WRLCK, ofst+WIN_
d7f0: 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
d800: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d810: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d820: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
d830: 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
d840: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
d850: 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
d860: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
d870: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
d880: 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
d890: 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
d8a0: 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
d8b0: 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
d8c0: 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
d8d0: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
d8e0: 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29 47     p->id, (int)G
d8f0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
d900: 49 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  Id(), p->sharedM
d910: 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
d920: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72 63 20  ,.           rc 
d930: 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
d940: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
d950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
d960: 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
d970: 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
d980: 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
d990: 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
d9a0: 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
d9b0: 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
d9c0: 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
d9d0: 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
d9e0: 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
d9f0: 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
da00: 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
da10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da20: 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20  winShmBarrier(. 
da30: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
da40: 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  d          /* Da
da50: 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74  tabase holding t
da60: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
da70: 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
da80: 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
da90: 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65   /* MemoryBarrie
daa0: 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74  r(); // does not
dab0: 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20   work -- do not 
dac0: 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a  know why not */.
dad0: 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
dae0: 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65  ex();.  winShmLe
daf0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
db00: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
db10: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
db20: 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  obtain a pointer
db30: 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69   to region iRegi
db40: 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68  on of the .** sh
db50: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
db60: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
db70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
db80: 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
db90: 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20  regions .** are 
dba0: 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e  numbered startin
dbb0: 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63  g from zero. Eac
dbc0: 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  h shared-memory 
dbd0: 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69  region is szRegi
dbe0: 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  on .** bytes in 
dbf0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
dc00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
dc10: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
dc20: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
dc30: 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
dc40: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
dc50: 65 2c 20 69 66 20 74 68 65 20 69 73 57 72 69 74  e, if the isWrit
dc60: 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  e parameter is 0
dc70: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
dc80: 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
dc90: 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  .** region has n
dca0: 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
dcb0: 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  d (by any client
dcc0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20  , including one 
dcd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20  running in a.** 
dce0: 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73  separate process
dcf0: 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73  ), then *pp is s
dd00: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
dd10: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
dd20: 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74  d. If .** isWrit
dd30: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  e is non-zero an
dd40: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
dd50: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
dd60: 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  gion has not yet
dd70: 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61   .** been alloca
dd80: 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63  ted, it is alloc
dd90: 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ated by this fun
dda0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
ddb0: 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
ddc0: 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72  y region has alr
ddd0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
dde0: 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61  ted or is alloca
ddf0: 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63  ted by.** this c
de00: 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64  all as described
de10: 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20   above, then it 
de20: 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  is mapped into t
de30: 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a  his processes .*
de40: 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
de50: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
de60: 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
de70: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
de80: 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65  he mapped .** me
de90: 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
dea0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
deb0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
dec0: 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
ded0: 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
dee0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
def0: 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
df00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
df10: 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df30: 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
df40: 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
df50: 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
df60: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
df70: 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
df80: 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20  int isWrite,    
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
dfb0: 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
dfc0: 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
dfd0: 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
dfe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
dff0: 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
e000: 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
e010: 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
e020: 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a  *)fd;.  winShm *
e030: 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
e040: 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
e050: 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
e060: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
e070: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
e080: 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72  rc = winOpenShar
e090: 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
e0a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
e0b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
e0c0: 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46  rc;.    p = pDbF
e0d0: 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70  d->pShm;.  }.  p
e0e0: 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
e0f0: 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65  mNode;..  sqlite
e100: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
e110: 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
e120: 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
e130: 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
e140: 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
e150: 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
e160: 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
e170: 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
e180: 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ion ){.    struc
e190: 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e  t ShmRegion *apN
e1a0: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
e1b0: 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61   New aRegion[] a
e1c0: 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
e1d0: 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e  nByte = (iRegion
e1e0: 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f  +1)*szRegion;  /
e1f0: 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72  * Minimum requir
e200: 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
e210: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
e220: 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  4 sz;           
e230: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
e240: 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e  t size of wal-in
e250: 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  dex file */..   
e260: 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
e270: 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
e280: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
e290: 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
e2a0: 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
e2b0: 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
e2c0: 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
e2d0: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
e2e0: 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
e2f0: 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
e300: 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
e310: 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  x file is.    **
e320: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
e330: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
e340: 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
e350: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
e360: 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c  winFileSize((sql
e370: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
e380: 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73  mNode->hFile, &s
e390: 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  z);.    if( rc!=
e3a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e3b0: 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
e3c0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
e3d0: 5f 53 48 4d 53 49 5a 45 2c 20 22 77 69 6e 53 68  _SHMSIZE, "winSh
e3e0: 6d 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap1", pDbFd->z
e3f0: 50 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74  Path);.      got
e400: 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
e410: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a     }..    if( sz
e420: 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
e430: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
e440: 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
e450: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
e460: 66 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74  f isWrite is set
e470: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   to.      ** zer
e480: 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  o, exit early. *
e490: 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
e4a0: 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
e4b0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
e4c0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
e4d0: 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
e4e0: 69 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  if isWrite is no
e4f0: 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75  n-zero, use ftru
e500: 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63  ncate() to alloc
e510: 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ate.      ** the
e520: 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
e530: 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20  y region..      
e540: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
e550: 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d  Write ) goto shm
e560: 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
e570: 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
e580: 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
e590: 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
e5a0: 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  e, nByte);.     
e5b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e5c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
e5d0: 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
e5e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
e5f0: 49 5a 45 2c 20 22 77 69 6e 53 68 6d 4d 61 70 32  IZE, "winShmMap2
e600: 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
e610: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
e620: 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
e630: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
e640: 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
e650: 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
e660: 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
e670: 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
e680: 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
e690: 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
e6a0: 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
e6b0: 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
e6c0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
e6d0: 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
e6e0: 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
e6f0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
e700: 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
e710: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e720: 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
e730: 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
e740: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
e750: 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
e760: 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
e770: 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
e780: 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
e790: 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
e7a0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
e7b0: 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
e7c0: 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
e7d0: 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
e7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e7f0: 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
e800: 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 20  egion */.     . 
e810: 20 20 20 20 20 68 4d 61 70 20 3d 20 43 72 65 61       hMap = Crea
e820: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 28 70 53  teFileMapping(pS
e830: 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c  hmNode->hFile.h,
e840: 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c   .          NULL
e850: 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
e860: 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
e870: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
e880: 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
e890: 50 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20  P pid-%d create 
e8a0: 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d  region=%d nbyte=
e8b0: 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
e8c0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 47 65           (int)Ge
e8d0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
e8e0: 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
e8f0: 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
e910: 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
e920: 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
e930: 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
e940: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
e950: 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
e960: 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
e970: 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
e980: 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
e990: 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
e9a0: 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
e9b0: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  ity;.        pMa
e9c0: 70 20 3d 20 4d 61 70 56 69 65 77 4f 66 46 69 6c  p = MapViewOfFil
e9d0: 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
e9e0: 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
e9f0: 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
ea00: 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
ea10: 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
ea20: 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
ea30: 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
ea40: 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
ea50: 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d  E(("SHM-MAP pid-
ea60: 25 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64  %d map region=%d
ea70: 20 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d   offset=%d size=
ea80: 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
ea90: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
eaa0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
eab0: 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
eac0: 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
ead0: 74 2c 20 73 7a 52 65 67 69 6f 6e 2c 0a 20 20 20  t, szRegion,.   
eae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d                pM
eaf0: 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
eb00: 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
eb10: 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
eb20: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
eb30: 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
eb40: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
eb50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
eb60: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
eb70: 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22  _IOERR_SHMMAP, "
eb80: 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62  winShmMap3", pDb
eb90: 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
eba0: 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20 43      if( hMap ) C
ebb0: 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29  loseHandle(hMap)
ebc0: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
ebd0: 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
ebe0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e    }..      pShmN
ebf0: 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
ec00: 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
ec10: 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20  pMap = pMap;.   
ec20: 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
ec30: 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
ec40: 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68  Region].hMap = h
ec50: 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
ec60: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
ec70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
ec80: 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
ec90: 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
eca0: 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  iRegion ){.    i
ecb0: 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65  nt iOffset = iRe
ecc0: 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
ecd0: 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
ece0: 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
ecf0: 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
ed00: 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
ed10: 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20  ty;.    char *p 
ed20: 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f  = (char *)pShmNo
ed30: 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67  de->aRegion[iReg
ed40: 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a  ion].pMap;.    *
ed50: 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  pp = (void *)&p[
ed60: 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20  iOffsetShift];. 
ed70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
ed80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
ed90: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
eda0: 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
edb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
edc0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
edd0: 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  winShmMap     0.
ede0: 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c  # define winShmL
edf0: 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
ee00: 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20  e winShmBarrier 
ee10: 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
ee20: 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
ee30: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
ee40: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
ee50: 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
ee60: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
ee70: 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
ee80: 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
ee90: 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
eea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
eeb0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
eec0: 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
eed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eee0: 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
eef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
ef40: 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
ef50: 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
ef60: 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
ef70: 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  on an.** sqlite3
ef80: 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e  _file for win32.
ef90: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
efa0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
efb0: 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20  ods winIoMethod 
efc0: 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20 20  = {.  2,        
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
eff0: 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c  n */.  winClose,
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
f020: 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20   */.  winRead,  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
f050: 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20  /.  winWrite,   
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
f080: 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20  .  winTruncate, 
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
f0b0: 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20  */.  winSync,   
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
f0e0: 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20  .  winFileSize, 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
f110: 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20  */.  winLock,   
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f130: 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
f140: 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20  .  winUnlock,   
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
f170: 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
f180: 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  vedLock,        
f190: 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
f1a0: 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  rvedLock */.  wi
f1b0: 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  nFileControl,   
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f1d0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
f1e0: 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  .  winSectorSize
f1f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f200: 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
f210: 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65  e */.  winDevice
f220: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
f230: 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63         /* xDevic
f240: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
f250: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c   */.  winShmMap,
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
f280: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b   */.  winShmLock
f290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f2a0: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
f2b0: 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72  k */.  winShmBar
f2c0: 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
f2d0: 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
f2e0: 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
f2f0: 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20  mUnmap          
f300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
f310: 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f  hmUnmap */.};../
f320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
f370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
f390: 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
f3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
f3c0: 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
f3d0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
f3e0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
f3f0: 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
f400: 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
f410: 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ct..*/../*.** Co
f420: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69  nvert a UTF-8 fi
f430: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74  lename into what
f440: 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e  ever form the un
f450: 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72  derlying.** oper
f460: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e  ating system wan
f470: 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e  ts filenames in.
f480: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
f490: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73  the result.** is
f4a0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
f4b0: 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
f4c0: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
f4d0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
f4e0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
f4f0: 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46  id *convertUtf8F
f500: 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
f510: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
f520: 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
f530: 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73  ed = 0;.  if( is
f540: 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
f550: 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55  verted = utf8ToU
f560: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
f570: 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20  );./* isNT() is 
f580: 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
f590: 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
f5a0: 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
f5b0: 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a 23 69 66  xecuted. .*/.#if
f5c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
f5d0: 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
f5e0: 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
f5f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
f600: 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61  _to_mbcs(zFilena
f610: 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  me);.#endif.  }.
f620: 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
f630: 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
f640: 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
f650: 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
f660: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
f670: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
f680: 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
f690: 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
f6a0: 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
f6b0: 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68   at pVfs->mxPath
f6c0: 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e  name characters.
f6d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
f6e0: 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
f6f0: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
f700: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
f710: 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
f720: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
f730: 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
f740: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
f750: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
f760: 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
f770: 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
f780: 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d  char zTempPath[M
f790: 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 0a 20 20 2f  AX_PATH+1];..  /
f7a0: 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
f7b0: 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
f7c0: 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
f7d0: 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
f7e0: 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
f7f0: 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
f800: 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
f810: 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
f820: 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
f830: 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
f840: 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
f850: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
f860: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
f870: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  .  if( sqlite3_t
f880: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
f890: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
f8a0: 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33  rintf(MAX_PATH-3
f8b0: 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25  0, zTempPath, "%
f8c0: 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  s", sqlite3_temp
f8d0: 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d  _directory);.  }
f8e0: 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20  else if( isNT() 
f8f0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
f900: 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a  lti;.    WCHAR z
f910: 57 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54  WidePath[MAX_PAT
f920: 48 5d 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50  H];.    GetTempP
f930: 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30  athW(MAX_PATH-30
f940: 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  , zWidePath);.  
f950: 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f    zMulti = unico
f960: 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
f970: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
f980: 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
f990: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
f9a0: 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
f9b0: 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  Path, "%s", zMul
f9c0: 74 69 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  ti);.      free(
f9d0: 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c  zMulti);.    }el
f9e0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
f9f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
fa00: 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69     }./* isNT() i
fa10: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
fa20: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
fa30: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
fa40: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
fa50: 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
fa60: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
fa70: 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
fa80: 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
fa90: 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
faa0: 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
fab0: 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
fac0: 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
fad0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
fae0: 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
faf0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
fb00: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73  ;.    char zMbcs
fb10: 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
fb20: 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 41      GetTempPathA
fb30: 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
fb40: 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
fb50: 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
fb60: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
fb70: 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
fb80: 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
fb90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
fba0: 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
fbb0: 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
fbc0: 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
fbd0: 20 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20   free(zUtf8);.  
fbe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
fbf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fc00: 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  EM;.    }.#endif
fc10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
fc20: 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
fc30: 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
fc40: 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
fc50: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a  temporary file .
fc60: 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74    ** name. If it
fc70: 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   is not, return 
fc80: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20  SQLITE_ERROR..  
fc90: 2a 2f 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  */.  if( (sqlite
fca0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50  3Strlen30(zTempP
fcb0: 61 74 68 29 20 2b 20 73 71 6c 69 74 65 33 53 74  ath) + sqlite3St
fcc0: 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
fcd0: 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20  MP_FILE_PREFIX) 
fce0: 2b 20 31 37 29 20 3e 3d 20 6e 42 75 66 20 29 7b  + 17) >= nBuf ){
fcf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fd00: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
fd10: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53 74   for(i=sqlite3St
fd20: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68  rlen30(zTempPath
fd30: 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50  ); i>0 && zTempP
fd40: 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20  ath[i-1]=='\\'; 
fd50: 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61  i--){}.  zTempPa
fd60: 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71  th[i] = 0;..  sq
fd70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
fd80: 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 0a 20 20  Buf-17, zBuf,.  
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45   "%s\\"SQLITE_TE
fdb0: 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
fdc0: 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20  zTempPath);.  j 
fdd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
fde0: 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  0(zBuf);.  sqlit
fdf0: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
fe00: 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66  , &zBuf[j]);.  f
fe10: 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
fe20: 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  +, j++){.    zBu
fe30: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
fe40: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
fe50: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
fe60: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
fe70: 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a   ];.  }.  zBuf[j
fe80: 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  ] = 0;..  OSTRAC
fe90: 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d  E(("TEMP FILENAM
fea0: 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29  E: %s\n", zBuf))
feb0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
fec0: 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
fed0: 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
fee0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
fef0: 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
ff00: 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
ff10: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
ff20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ff30: 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  me,        /* Na
ff40: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
ff50: 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
ff60: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
ff70: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
ff80: 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68  he SQLite file h
ff90: 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
ffa0: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
ffb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
ffc0: 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a  n mode flags */.
ffd0: 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fff0: 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61  tatus return fla
10000 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c  gs */.){.  HANDL
10010 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  E h;.  DWORD dwD
10020 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
10030 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
10040 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
10050 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
10060 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
10070 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
10080 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   0;.#if SQLITE_O
10090 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73  S_WINCE.  int is
100a0 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Temp = 0;.#endif
100b0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
100c0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
100d0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
100e0 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
100f0 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69     /* Filename i
10100 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  n OS encoding */
10110 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10120 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Utf8Name = zName
10130 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e  ; /* Filename in
10140 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20   UTF-8 encoding 
10150 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  */..  /* If argu
10160 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
10170 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
10180 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
10190 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
101a0 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
101b0 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
101c0 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
101d0 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
101e0 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
101f0 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b  mpname[MAX_PATH+
10200 31 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66 65  1];     /* Buffe
10210 72 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  r used to create
10220 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a   temp filename *
10230 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  /..  int rc = SQ
10240 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
10250 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
10260 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23  Return Code */.#
10270 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
10280 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  UG) || SQLITE_OS
10290 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79  _WINCE.  int eTy
102a0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
102b0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
102c0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
102d0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74  */.#endif..  int
102e0 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
102f0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
10300 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
10310 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
10320 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
10330 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
10340 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
10350 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
10360 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
10370 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69  OPEN_CREATE);.#i
10380 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
10390 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
103a0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
103b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
103c0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69  ;.#endif.  int i
103d0 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
103e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
103f0 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a  EN_READWRITE);..
10400 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
10410 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e   int isOpenJourn
10420 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  al = (isCreate &
10430 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70  & (.        eTyp
10440 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
10450 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
10460 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
10470 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
10480 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
10490 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
104a0 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e  EN_WAL.  ));.#en
104b0 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  dif..  /* Check 
104c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
104d0 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
104e0 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
104f0 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
10500 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
10510 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
10520 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
10530 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
10540 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
10550 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
10560 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
10570 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
10580 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
10590 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
105a0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
105b0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
105c0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
105d0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
105e0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
105f0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
10600 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
10610 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
10620 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
10630 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
10640 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
10650 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
10660 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
10670 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
10680 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
10690 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
106a0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
106b0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
106c0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
106d0 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
106e0 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
106f0 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
10700 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
10710 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
10720 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
10730 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
10740 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
10750 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
10760 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
10770 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
10780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
10790 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
107a0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
107b0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
107c0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
107d0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
107e0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
107f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
10800 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
10810 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
10820 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
10830 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
10840 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
10850 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
10860 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
10870 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
10880 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
10890 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
108a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
108b0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
108c0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
108d0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
108e0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
108f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
10900 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
10910 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
10920 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
10930 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
10940 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
10950 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
10960 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
10970 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
10980 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
10990 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
109a0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
109b0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
109c0 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
109d0 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53   id!=0 );.  UNUS
109e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
109f0 73 29 3b 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20  s);..  pFile->h 
10a00 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
10a10 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66  _VALUE;..  /* If
10a20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
10a30 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
10a40 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
10a50 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20  enerate a .  ** 
10a60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
10a70 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f  ame to use .  */
10a80 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
10a90 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
10aa0 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
10ab0 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  penJournal);.   
10ac0 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
10ad0 65 28 4d 41 58 5f 50 41 54 48 2b 31 2c 20 7a 54  e(MAX_PATH+1, zT
10ae0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
10af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10b00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10b10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  c;.    }.    zUt
10b20 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d  f8Name = zTmpnam
10b30 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  e;.  }..  /* Con
10b40 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
10b50 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
10b60 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
10b70 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
10b80 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
10b90 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
10ba0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
10bb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
10bd0 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
10be0 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  te ){.    dwDesi
10bf0 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
10c00 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
10c10 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
10c20 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
10c30 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
10c40 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _READ;.  }..  /*
10c50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
10c60 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
10c70 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10c80 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a   a new file is .
10c90 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51    ** created. SQ
10ca0 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65  Lite doesn't use
10cb0 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20   it to indicate 
10cc0 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73  "exclusive acces
10cd0 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69  s" .  ** as it i
10ce0 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73  s usually unders
10cf0 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tood..  */.  if(
10d00 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a   isExclusive ){.
10d10 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61      /* Creates a
10d20 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20   new file, only 
10d30 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
10d40 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f  lready exist. */
10d50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
10d60 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66  ile exists, it f
10d70 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ails. */.    dwC
10d80 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
10d90 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b  on = CREATE_NEW;
10da0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43  .  }else if( isC
10db0 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20  reate ){.    /* 
10dc0 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69  Open existing fi
10dd0 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66  le, or create if
10de0 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73   it doesn't exis
10df0 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  t */.    dwCreat
10e00 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
10e10 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20   OPEN_ALWAYS;.  
10e20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70  }else{.    /* Op
10e30 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79  ens a file, only
10e40 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a   if it exists. *
10e50 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
10e60 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
10e70 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d  EN_EXISTING;.  }
10e80 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20  ..  dwShareMode 
10e90 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41  = FILE_SHARE_REA
10ea0 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57  D | FILE_SHARE_W
10eb0 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44  RITE;..  if( isD
10ec0 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c  elete ){.#if SQL
10ed0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
10ee0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
10ef0 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
10f00 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20  RIBUTE_HIDDEN;. 
10f10 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23     isTemp = 1;.#
10f20 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73  else.    dwFlags
10f30 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
10f40 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54  FILE_ATTRIBUTE_T
10f50 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20  EMPORARY.       
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f70 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41          | FILE_A
10f80 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a  TTRIBUTE_HIDDEN.
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
10fb0 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54   FILE_FLAG_DELET
10fc0 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64  E_ON_CLOSE;.#end
10fd0 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
10fe0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
10ff0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
11000 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  IBUTE_NORMAL;.  
11010 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66  }.  /* Reports f
11020 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74  rom the internet
11030 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72   are that perfor
11040 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a  mance is always.
11050 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46    ** better if F
11060 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
11070 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20  ACCESS is used. 
11080 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a   Ticket #2699. *
11090 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
110a0 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41  WINCE.  dwFlagsA
110b0 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20  ndAttributes |= 
110c0 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
110d0 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a  _ACCESS;.#endif.
110e0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
110f0 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46  .    h = CreateF
11100 69 6c 65 57 28 28 57 43 48 41 52 2a 29 7a 43 6f  ileW((WCHAR*)zCo
11110 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
11120 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
11130 0a 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d  .       dwShareM
11140 6f 64 65 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c  ode,.       NULL
11150 2c 0a 20 20 20 20 20 20 20 64 77 43 72 65 61 74  ,.       dwCreat
11160 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
11170 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
11180 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
11190 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a      NULL.    );.
111a0 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
111b0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
111c0 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
111d0 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
111e0 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
111f0 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
11200 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
11210 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
11220 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
11230 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
11240 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
11250 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
11260 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
11270 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
11280 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
11290 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41 28  h = CreateFileA(
112a0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
112b0 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65 73 69  d,.       dwDesi
112c0 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
112d0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20    dwShareMode,. 
112e0 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
112f0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
11300 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
11310 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
11320 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 4e 55  butes,.       NU
11330 4c 4c 0a 20 20 20 20 29 3b 0a 23 65 6e 64 69 66  LL.    );.#endif
11340 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
11350 28 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78 25  ("OPEN %d %s 0x%
11360 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  lx %s\n", .     
11370 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20        h, zName, 
11380 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
11390 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d 3d   .           h==
113a0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
113b0 41 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22 20  ALUE ? "failed" 
113c0 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28  : "ok"));..  if(
113d0 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
113e0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
113f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11400 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
11410 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
11420 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
11430 45 4e 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a  EN, "winOpen", z
11440 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 66  Utf8Name);.    f
11450 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
11460 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
11470 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  rite ){.      re
11480 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66  turn winOpen(pVf
11490 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20  s, zName, id, . 
114a0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66 6c              ((fl
114b0 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags|SQLITE_OPEN_
114c0 52 45 41 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49  READONLY)&~(SQLI
114d0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
114e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
114f0 52 49 54 45 29 29 2c 20 70 4f 75 74 46 6c 61 67  RITE)), pOutFlag
11500 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
11510 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11520 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
11530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
11540 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a  f( pOutFlags ){.
11550 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
11560 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f  ite ){.      *pO
11570 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
11580 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
11590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
115a0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
115b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
115c0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  NLY;.    }.  }..
115d0 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
115e0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65  0, sizeof(*pFile
115f0 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  ));.  pFile->pMe
11600 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
11610 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  hod;.  pFile->h 
11620 3d 20 68 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  = h;.  pFile->la
11630 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
11640 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  OR;.  pFile->pVf
11650 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
11660 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 70  e->pShm = 0;.  p
11670 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e  File->zPath = zN
11680 61 6d 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 73 65  ame;.  pFile->se
11690 63 74 6f 72 53 69 7a 65 20 3d 20 67 65 74 53 65  ctorSize = getSe
116a0 63 74 6f 72 53 69 7a 65 28 70 56 66 73 2c 20 7a  ctorSize(pVfs, z
116b0 55 74 66 38 4e 61 6d 65 29 3b 0a 0a 23 69 66 20  Utf8Name);..#if 
116c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
116d0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
116e0 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
116f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
11700 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63 65         && !wince
11710 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65  CreateLock(zName
11720 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20 20  , pFile).  ){.  
11730 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29    CloseHandle(h)
11740 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  ;.    free(zConv
11750 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
11760 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
11770 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EN_BKPT;.  }.  i
11780 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
11790 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
117a0 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
117b0 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
117c0 64 69 66 0a 20 20 7b 0a 20 20 20 20 66 72 65 65  dif.  {.    free
117d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
117e0 7d 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  }..  OpenCounter
117f0 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (+1);.  return r
11800 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
11810 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
11820 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
11830 61 74 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20  at windows does 
11840 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65  not allow a file
11850 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
11860 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  f some other.** 
11870 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f  process has it o
11880 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  pen.  Sometimes 
11890 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20  a virus scanner 
118a0 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67  or indexing prog
118b0 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e  ram.** will open
118c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
118d0 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74  shortly after it
118e0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f   is created in o
118f0 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68  rder to do.** wh
11900 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20  atever it does. 
11910 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65   While this othe
11920 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
11930 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
11940 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62   open, we will b
11950 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65  e unable to dele
11960 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20  te it.  To work 
11970 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70  around this.** p
11980 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79  roblem, we delay
11990 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
119a0 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c  s and try to del
119b0 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a  ete again.  Up.*
119c0 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  * to MX_DELETION
119d0 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69  _ATTEMPTs deleti
119e0 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  on attempts are 
119f0 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e  run before givin
11a00 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75  g.** up and retu
11a10 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
11a20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 44 45  */.#define MX_DE
11a30 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20  LETION_ATTEMPTS 
11a40 35 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  5.static int win
11a50 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
11a60 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
11a70 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
11a80 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
11a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
11aa0 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
11ab0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
11ac0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73  elete */.  int s
11ad0 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20  yncDir          
11ae0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
11af0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29  ed on win32 */.)
11b00 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
11b10 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 44  .  DWORD rc;.  D
11b20 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 30 3b 0a  WORD error = 0;.
11b30 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
11b40 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
11b50 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
11b60 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11b70 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69  (syncDir);..  Si
11b80 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
11b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
11ba0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f  R_DELETE);.  zCo
11bb0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
11bc0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
11bd0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
11be0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
11bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11c00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
11c10 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
11c20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44 65 6c 65    do{.      Dele
11c30 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74  teFileW(zConvert
11c40 65 64 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ed);.    }while(
11c50 20 20 20 28 20 20 20 28 28 72 63 20 3d 20 47 65     (   ((rc = Ge
11c60 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
11c70 28 7a 43 6f 6e 76 65 72 74 65 64 29 29 20 21 3d  (zConverted)) !=
11c80 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
11c90 54 52 49 42 55 54 45 53 29 0a 20 20 20 20 20 20  TRIBUTES).      
11ca0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 65 72           || ((er
11cb0 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72 72  ror = GetLastErr
11cc0 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f 52 5f 41  or()) == ERROR_A
11cd0 43 43 45 53 53 5f 44 45 4e 49 45 44 29 29 0a 20  CCESS_DENIED)). 
11ce0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 2b 2b            && (++
11cf0 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45 54 49 4f  cnt < MX_DELETIO
11d00 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20 20 20 20  N_ATTEMPTS).    
11d10 20 20 20 20 20 20 20 26 26 20 28 53 6c 65 65 70         && (Sleep
11d20 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 2f 2a 20  (100), 1) );./* 
11d30 69 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53  isNT() is 1 if S
11d40 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
11d50 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20  1, so this else 
11d60 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
11d70 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65  d. .** Since the
11d80 20 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f   ASCII version o
11d90 66 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20  f these Windows 
11da0 41 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  API do not exist
11db0 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69   for WINCE,.** i
11dc0 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
11dd0 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74   not reference t
11de0 68 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75  hem for WINCE bu
11df0 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  ilds..*/.#if SQL
11e00 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
11e10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 7b    }else{.    do{
11e20 0a 20 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c  .      DeleteFil
11e30 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  eA(zConverted);.
11e40 20 20 20 20 7d 77 68 69 6c 65 28 20 20 20 28 20      }while(   ( 
11e50 20 20 28 28 72 63 20 3d 20 47 65 74 46 69 6c 65    ((rc = GetFile
11e60 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
11e70 76 65 72 74 65 64 29 29 20 21 3d 20 49 4e 56 41  verted)) != INVA
11e80 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
11e90 54 45 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  TES).           
11ea0 20 20 20 20 7c 7c 20 28 28 65 72 72 6f 72 20 3d      || ((error =
11eb0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
11ec0 20 3d 3d 20 45 52 52 4f 52 5f 41 43 43 45 53 53   == ERROR_ACCESS
11ed0 5f 44 45 4e 49 45 44 29 29 0a 20 20 20 20 20 20  _DENIED)).      
11ee0 20 20 20 20 20 26 26 20 28 2b 2b 63 6e 74 20 3c       && (++cnt <
11ef0 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
11f00 45 4d 50 54 53 29 0a 20 20 20 20 20 20 20 20 20  EMPTS).         
11f10 20 20 26 26 20 28 53 6c 65 65 70 28 31 30 30 29    && (Sleep(100)
11f20 2c 20 31 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  , 1) );.#endif. 
11f30 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65   }.  free(zConve
11f40 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
11f50 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22  (("DELETE \"%s\"
11f60 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d   %s\n", zFilenam
11f70 65 2c 0a 20 20 20 20 20 20 20 28 20 28 72 63 3d  e,.       ( (rc=
11f80 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
11f90 54 52 49 42 55 54 45 53 29 20 26 26 20 28 65 72  TRIBUTES) && (er
11fa0 72 6f 72 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  ror==ERROR_FILE_
11fb0 4e 4f 54 5f 46 4f 55 4e 44 29 29 20 3f 0a 20 20  NOT_FOUND)) ?.  
11fc0 20 20 20 20 20 20 20 22 6f 6b 22 20 3a 20 22 66         "ok" : "f
11fd0 61 69 6c 65 64 22 20 29 29 3b 0a 20 0a 20 20 72  ailed" ));. .  r
11fe0 65 74 75 72 6e 20 28 20 20 20 28 72 63 20 3d 3d  eturn (   (rc ==
11ff0 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
12000 54 52 49 42 55 54 45 53 29 20 0a 20 20 20 20 20  TRIBUTES) .     
12010 20 20 20 20 20 26 26 20 28 65 72 72 6f 72 20 3d       && (error =
12020 3d 20 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  = ERROR_FILE_NOT
12030 5f 46 4f 55 4e 44 29 29 20 3f 20 53 51 4c 49 54  _FOUND)) ? SQLIT
12040 45 5f 4f 4b 20 3a 0a 20 20 20 20 20 20 20 20 20  E_OK :.         
12050 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72          winLogEr
12060 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12070 5f 44 45 4c 45 54 45 2c 20 22 77 69 6e 44 65 6c  _DELETE, "winDel
12080 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
12090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
120a0 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 61   the existance a
120b0 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66  nd status of a f
120c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
120d0 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20  nt winAccess(.  
120e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
120f0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  s,         /* No
12100 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
12110 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12120 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
12130 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
12140 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
12150 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12160 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
12170 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65   of test to make
12180 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
12190 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121b0 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a   OUT: Result */.
121c0 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
121d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
121e0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
121f0 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
12200 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
12210 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
12220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12230 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
12240 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
12250 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
12260 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
12270 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
12280 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
12290 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
122a0 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
122b0 29 7b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  ){.    WIN32_FIL
122c0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
122d0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
122e0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
122f0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
12300 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66  trData));.    if
12310 28 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  ( GetFileAttribu
12320 74 65 73 45 78 57 28 28 57 43 48 41 52 2a 29 7a  tesExW((WCHAR*)z
12330 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
12360 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
12370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
12390 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
123a0 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
123b0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
123c0 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
123d0 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
123e0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
123f0 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
12400 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
12410 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
12420 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
12430 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
12440 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
12450 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
12460 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
12470 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
12480 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
12490 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
124a0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
124b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
124c0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
124d0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
124e0 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
124f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12500 20 69 66 28 20 47 65 74 4c 61 73 74 45 72 72 6f   if( GetLastErro
12510 72 28 29 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  r()!=ERROR_FILE_
12520 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
12530 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
12540 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
12550 43 45 53 53 2c 20 22 77 69 6e 41 63 63 65 73 73  CESS, "winAccess
12560 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
12570 20 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e         free(zCon
12580 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
12590 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
125a0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
125b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
125c0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
125d0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
125e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
125f0 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69  /* isNT() is 1 i
12600 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12610 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c  E==1, so this el
12620 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63  se is never exec
12630 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65 20  uted. .** Since 
12640 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69 6f  the ASCII versio
12650 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64 6f  n of these Windo
12660 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65 78  ws API do not ex
12670 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a 2a  ist for WINCE,.*
12680 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e 74  * it's important
12690 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e 63   to not referenc
126a0 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43 45  e them for WINCE
126b0 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20   builds..*/.#if 
126c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
126d0 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
126e0 61 74 74 72 20 3d 20 47 65 74 46 69 6c 65 41 74  attr = GetFileAt
126f0 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
12700 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
12710 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28  ndif.  }.  free(
12720 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73  zConverted);.  s
12730 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
12740 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12750 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
12760 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
12770 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
12780 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
12790 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
127a0 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61  UTES;.      brea
127b0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
127c0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
127d0 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  ITE:.      rc = 
127e0 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  (attr & FILE_ATT
127f0 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29  RIBUTE_READONLY)
12800 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ==0;.      break
12810 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
12820 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
12830 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
12840 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
12850 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72  ResOut = rc;.  r
12860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12870 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20  .}.../*.** Turn 
12880 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
12890 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20  ame into a full 
128a0 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65  pathname.  Write
128b0 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74   the full.** pat
128c0 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b  hname into zOut[
128d0 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20  ].  zOut[] will 
128e0 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66 73  be at least pVfs
128f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20  ->mxPathname.** 
12900 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
12910 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12920 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
12930 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12940 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
12950 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
12960 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73  object */.  cons
12970 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
12980 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  e,        /* Pos
12990 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69  sibly relative i
129a0 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69  nput path */.  i
129b0 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20  nt nFull,       
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
129d0 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
129e0 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
129f0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66    /* Output buff
12a20 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20  er */.){.  .#if 
12a30 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
12a40 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
12a50 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
12a60 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
12a70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12a80 28 6e 46 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69  (nFull);.  cygwi
12a90 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77  n_conv_to_full_w
12aa0 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c 61 74  in32_path(zRelat
12ab0 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72  ive, zFull);.  r
12ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12ad0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
12ae0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
12af0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12b10 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
12b20 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
12b30 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
12b40 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
12b50 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
12b60 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
12b70 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  old. */.  sqlite
12b80 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d  3_snprintf(pVfs-
12b90 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  >mxPathname, zFu
12ba0 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
12bb0 69 76 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ive);.  return S
12bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
12bd0 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
12be0 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
12bf0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
12c00 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 76 6f   int nByte;.  vo
12c10 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
12c20 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20    char *zOut;.. 
12c30 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
12c40 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
12c50 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
12c60 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
12c70 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
12c80 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
12c90 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
12ca0 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
12cb0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
12cc0 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
12cd0 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
12ce0 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20  Relative[1]) && 
12cf0 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a  zRelative[2]==':
12d00 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69  ' ){.    zRelati
12d10 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ve++;.  }..  /* 
12d20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
12d30 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
12d40 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
12d50 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
12d60 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
12d70 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
12d80 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
12d90 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
12da0 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
12db0 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
12dc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
12dd0 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
12de0 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
12df0 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
12e00 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
12e10 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
12e20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
12e30 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
12e40 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
12e50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12e60 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43 6f 6e 76 65  nFull);.  zConve
12e70 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
12e80 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
12e90 74 69 76 65 29 3b 0a 20 20 69 66 28 20 69 73 4e  tive);.  if( isN
12ea0 54 28 29 20 29 7b 0a 20 20 20 20 57 43 48 41 52  T() ){.    WCHAR
12eb0 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
12ec0 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68  te = GetFullPath
12ed0 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29 7a 43  NameW((WCHAR*)zC
12ee0 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
12ef0 30 29 20 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d  0) + 3;.    zTem
12f00 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74  p = malloc( nByt
12f10 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
12f20 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
12f30 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
12f40 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
12f50 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12f60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12f70 20 7d 0a 20 20 20 20 47 65 74 46 75 6c 6c 50 61   }.    GetFullPa
12f80 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52 2a 29  thNameW((WCHAR*)
12f90 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
12fa0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
12fb0 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
12fc0 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75  d);.    zOut = u
12fd0 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
12fe0 6d 70 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 54  mp);.    free(zT
12ff0 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  emp);./* isNT() 
13000 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
13010 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
13020 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
13030 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20  r executed. .** 
13040 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20  Since the ASCII 
13050 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65  version of these
13060 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20   Windows API do 
13070 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49  not exist for WI
13080 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70  NCE,.** it's imp
13090 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65  ortant to not re
130a0 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72  ference them for
130b0 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a   WINCE builds..*
130c0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
130d0 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
130e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
130f0 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 47  p;.    nByte = G
13100 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
13110 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
13120 64 2c 20 30 2c 20 30 2c 20 30 29 20 2b 20 33 3b  d, 0, 0, 0) + 3;
13130 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 6d 61 6c  .    zTemp = mal
13140 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
13150 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
13160 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
13170 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43  ){.      free(zC
13180 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
13190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
131a0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
131b0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
131c0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
131d0 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
131e0 2c 20 30 29 3b 0a 20 20 20 20 66 72 65 65 28 7a  , 0);.    free(z
131f0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
13200 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
13210 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
13220 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72  8(zTemp);.    fr
13230 65 65 28 7a 54 65 6d 70 29 3b 0a 23 65 6e 64 69  ee(zTemp);.#endi
13240 66 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4f 75 74  f.  }.  if( zOut
13250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
13260 73 6e 70 72 69 6e 74 66 28 70 56 66 73 2d 3e 6d  snprintf(pVfs->m
13270 78 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  xPathname, zFull
13280 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
13290 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20     free(zOut);. 
132a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
132b0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
132c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
132d0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
132e0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74  f.}../*.** Get t
132f0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f  he sector size o
13300 66 20 74 68 65 20 64 65 76 69 63 65 20 75 73 65  f the device use
13310 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 66 69  d to store.** fi
13320 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13330 74 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65 28  t getSectorSize(
13340 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
13350 20 2a 70 56 66 73 2c 0a 20 20 20 20 63 6f 6e 73   *pVfs,.    cons
13360 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76  t char *zRelativ
13370 65 20 20 20 20 20 2f 2a 20 55 54 46 2d 38 20 66  e     /* UTF-8 f
13380 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  ile name */.){. 
13390 20 44 57 4f 52 44 20 62 79 74 65 73 50 65 72 53   DWORD bytesPerS
133a0 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
133b0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
133c0 5a 45 3b 0a 20 20 2f 2a 20 47 65 74 44 69 73 6b  ZE;.  /* GetDisk
133d0 46 72 65 65 53 70 61 63 65 20 69 73 20 6e 6f 74  FreeSpace is not
133e0 20 73 75 70 70 6f 72 74 65 64 20 75 6e 64 65 72   supported under
133f0 20 57 49 4e 43 45 20 2a 2f 0a 23 69 66 20 53 51   WINCE */.#if SQ
13400 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13410 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13420 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
13430 5f 50 41 52 41 4d 45 54 45 52 28 7a 52 65 6c 61  _PARAMETER(zRela
13440 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63  tive);.#else.  c
13450 68 61 72 20 7a 46 75 6c 6c 70 61 74 68 5b 4d 41  har zFullpath[MA
13460 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 69 6e 74  X_PATH+1];.  int
13470 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 64 77 52   rc;.  DWORD dwR
13480 65 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  et = 0;.  DWORD 
13490 64 77 44 75 6d 6d 79 3b 0a 0a 20 20 2f 2a 0a 20  dwDummy;..  /*. 
134a0 20 2a 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 67   ** We need to g
134b0 65 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  et the full path
134c0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
134d0 65 0a 20 20 2a 2a 20 74 6f 20 67 65 74 20 74 68  e.  ** to get th
134e0 65 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 74  e drive letter t
134f0 6f 20 6c 6f 6f 6b 20 75 70 20 74 68 65 20 73 65  o look up the se
13500 63 74 6f 72 0a 20 20 2a 2a 20 73 69 7a 65 2e 0a  ctor.  ** size..
13510 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
13520 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
13530 0a 20 20 72 63 20 3d 20 77 69 6e 46 75 6c 6c 50  .  rc = winFullP
13540 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 52  athname(pVfs, zR
13550 65 6c 61 74 69 76 65 2c 20 4d 41 58 5f 50 41 54  elative, MAX_PAT
13560 48 2c 20 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20  H, zFullpath);. 
13570 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13580 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 69 66 28  Benign(0);.  if(
13590 20 72 63 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc == SQLITE_OK
135a0 20 29 0a 20 20 7b 0a 20 20 20 20 76 6f 69 64 20   ).  {.    void 
135b0 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
135c0 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
135d0 65 28 7a 46 75 6c 6c 70 61 74 68 29 3b 0a 20 20  e(zFullpath);.  
135e0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
135f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
13600 4e 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NT() ){.        
13610 2f 2a 20 74 72 69 6d 20 70 61 74 68 20 74 6f 20  /* trim path to 
13620 6a 75 73 74 20 64 72 69 76 65 20 72 65 66 65 72  just drive refer
13630 65 6e 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ence */.        
13640 57 43 48 41 52 20 2a 70 20 3d 20 7a 43 6f 6e 76  WCHAR *p = zConv
13650 65 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66  erted;.        f
13660 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20  or(;*p;p++){.   
13670 20 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d         if( *p ==
13680 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20   '\\' ){.       
13690 20 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a       *p = '\0';.
136a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
136b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
136c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
136d0 20 64 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b   dwRet = GetDisk
136e0 46 72 65 65 53 70 61 63 65 57 28 28 57 43 48 41  FreeSpaceW((WCHA
136f0 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  R*)zConverted,. 
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20   &dwDummy,.     
13730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 26 62 79               &by
13750 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20  tesPerSector,.  
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13780 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20  &dwDummy,.      
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137a0 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
137b0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ummy);.      }el
137c0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74  se{.        /* t
137d0 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74  rim path to just
137e0 20 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65   drive reference
137f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
13800 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 7a 43   *p = (char *)zC
13810 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20  onverted;.      
13820 20 20 66 6f 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a    for(;*p;p++){.
13830 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 70            if( *p
13840 20 3d 3d 20 27 5c 5c 27 20 29 7b 0a 20 20 20 20   == '\\' ){.    
13850 20 20 20 20 20 20 20 20 2a 70 20 3d 20 27 5c 30          *p = '\0
13860 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ';.            b
13870 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
13880 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13890 20 20 20 20 64 77 52 65 74 20 3d 20 47 65 74 44      dwRet = GetD
138a0 69 73 6b 46 72 65 65 53 70 61 63 65 41 28 28 63  iskFreeSpaceA((c
138b0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
138c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
138d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138e0 20 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20     &dwDummy,.   
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
13910 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 2c 0a  bytesPerSector,.
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 20 20 26 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20    &dwDummy,.    
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
13970 77 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 7d  wDummy);.      }
13980 0a 20 20 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  .      free(zCon
13990 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 0a 20  verted);.    }. 
139a0 20 20 20 69 66 28 20 21 64 77 52 65 74 20 29 7b     if( !dwRet ){
139b0 0a 20 20 20 20 20 20 62 79 74 65 73 50 65 72 53  .      bytesPerS
139c0 65 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 44  ector = SQLITE_D
139d0 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
139e0 5a 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ZE;.    }.  }.#e
139f0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 28 69  ndif.  return (i
13a00 6e 74 29 20 62 79 74 65 73 50 65 72 53 65 63 74  nt) bytesPerSect
13a10 6f 72 3b 20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  or; .}..#ifndef 
13a20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
13a30 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
13a40 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
13a50 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
13a60 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
13a70 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
13a80 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
13a90 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
13aa0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
13ab0 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
13ac0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
13ad0 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
13ae0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
13af0 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
13b00 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
13b10 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
13b20 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
13b30 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
13b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13b50 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
13b60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
13b70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
13b80 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
13b90 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  h;.  void *zConv
13ba0 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
13bb0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
13bc0 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
13bd0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
13be0 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
13bf0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
13c00 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
13c10 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 68   isNT() ){.    h
13c20 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   = LoadLibraryW(
13c30 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72 74  (WCHAR*)zConvert
13c40 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  ed);./* isNT() i
13c50 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
13c60 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
13c70 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
13c80 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
13c90 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
13ca0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
13cb0 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
13cc0 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
13cd0 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
13ce0 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
13cf0 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
13d00 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
13d10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
13d20 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
13d30 0a 20 20 20 20 68 20 3d 20 4c 6f 61 64 4c 69 62  .    h = LoadLib
13d40 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
13d50 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
13d60 0a 20 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 6e  .  }.  free(zCon
13d70 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
13d80 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
13d90 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
13da0 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
13db0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
13dc0 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
13dd0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
13de0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65  ETER(pVfs);.  ge
13df0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e 42  tLastErrorMsg(nB
13e00 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  uf, zBufOut);.}.
13e10 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28  void (*winDlSym(
13e20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
13e30 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
13e40 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
13e50 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20  ymbol))(void){. 
13e60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13e70 52 28 70 56 66 73 29 3b 0a 23 69 66 20 53 51 4c  R(pVfs);.#if SQL
13e80 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
13e90 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
13ea0 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
13eb0 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
13ec0 65 20 6f 6e 20 77 69 6e 63 65 2e 20 2a 2f 0a 20  e on wince. */. 
13ed0 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29   return (void(*)
13ee0 28 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64  (void))GetProcAd
13ef0 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
13f00 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29  Handle, zSymbol)
13f10 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c  ;.#else.  /* All
13f20 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 73 20 70   other windows p
13f30 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20  latforms expect 
13f40 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29  GetProcAddress()
13f50 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e   to take.  ** an
13f60 20 41 6e 73 69 20 73 74 72 69 6e 67 20 72 65 67   Ansi string reg
13f70 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f  ardless of the _
13f80 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20  UNICODE setting 
13f90 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  */.  return (voi
13fa0 64 28 2a 29 28 76 6f 69 64 29 29 47 65 74 50 72  d(*)(void))GetPr
13fb0 6f 63 41 64 64 72 65 73 73 28 28 48 41 4e 44 4c  ocAddress((HANDL
13fc0 45 29 70 48 61 6e 64 6c 65 2c 20 7a 53 79 6d 62  E)pHandle, zSymb
13fd0 6f 6c 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f  ol);.#endif.}.vo
13fe0 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71  id winDlClose(sq
13ff0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14000 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
14010 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
14020 54 45 52 28 70 56 66 73 29 3b 0a 20 20 46 72 65  TER(pVfs);.  Fre
14030 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
14040 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  )pHandle);.}.#el
14050 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
14060 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
14070 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
14080 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
14090 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
140a0 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
140b0 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
140c0 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
140d0 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
140e0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  endif.../*.** Wr
140f0 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62  ite up to nBuf b
14100 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65  ytes of randomne
14110 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f  ss into zBuf..*/
14120 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
14130 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
14140 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
14150 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
14160 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  f){.  int n = 0;
14170 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
14180 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64  TER(pVfs);.#if d
14190 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
141a0 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a  ST).  n = nBuf;.
141b0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
141c0 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  , nBuf);.#else. 
141d0 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54   if( sizeof(SYST
141e0 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20  EMTIME)<=nBuf-n 
141f0 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d  ){.    SYSTEMTIM
14200 45 20 78 3b 0a 20 20 20 20 47 65 74 53 79 73 74  E x;.    GetSyst
14210 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20  emTime(&x);.    
14220 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
14230 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
14240 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
14250 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (x);.  }.  if( s
14260 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
14270 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
14280 44 20 70 69 64 20 3d 20 47 65 74 43 75 72 72 65  D pid = GetCurre
14290 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
142a0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
142b0 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
142c0 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
142d0 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
142e0 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44  }.  if( sizeof(D
142f0 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  WORD)<=nBuf-n ){
14300 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d  .    DWORD cnt =
14310 20 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b   GetTickCount();
14320 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
14330 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
14340 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
14350 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
14360 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
14370 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
14380 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
14390 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
143a0 20 20 20 20 51 75 65 72 79 50 65 72 66 6f 72 6d      QueryPerform
143b0 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b  anceCounter(&i);
143c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
143d0 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66  f[n], &i, sizeof
143e0 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (i));.    n += s
143f0 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65  izeof(i);.  }.#e
14400 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b  ndif.  return n;
14410 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
14420 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
14430 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
14440 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
14450 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
14460 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
14470 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
14480 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
14490 20 20 53 6c 65 65 70 28 28 6d 69 63 72 6f 73 65    Sleep((microse
144a0 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
144b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
144c0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
144d0 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
144e0 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
144f0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
14500 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
14510 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
14520 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
14530 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
14540 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
14550 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
14560 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
14570 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
14580 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
14590 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
145a0 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
145b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
145c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
145d0 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
145e0 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
145f0 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
14600 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
14610 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
14620 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
14630 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
14640 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
14650 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
14660 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
14670 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
14680 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
14690 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
146a0 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
146b0 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
146c0 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
146d0 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
146e0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
146f0 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
14700 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
14710 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
14720 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
14730 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
14740 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
14750 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
14760 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
14770 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
14780 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
14790 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
147a0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
147b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
147c0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
147d0 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
147e0 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
147f0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
14800 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72   /* FILETIME str
14810 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62  ucture is a 64-b
14820 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65  it value represe
14830 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nting the number
14840 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61   of .     100-na
14850 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
14860 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
14870 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
14880 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f  305813.5). .  */
14890 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a  .  FILETIME ft;.
148a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
148b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e  qlite3_int64 win
148c0 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20  FiletimeEpoch = 
148d0 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65  23058135*(sqlite
148e0 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b  3_int64)8640000;
148f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
14900 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EST.  static con
14910 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
14920 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34   unixEpoch = 244
14930 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69  05875*(sqlite3_i
14940 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65  nt64)8640000;.#e
14950 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d  ndif.  /* 2^32 -
14960 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66   to avoid use of
14970 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73   LL and warnings
14980 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61   in gcc */.  sta
14990 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
149a0 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74  3_int64 max32Bit
149b0 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28  Value = .      (
149c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
149d0 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
149e0 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
149f0 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
14a00 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
14a10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
14a20 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
14a30 4d 45 20 74 69 6d 65 3b 0a 20 20 47 65 74 53 79  ME time;.  GetSy
14a40 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
14a50 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
14a60 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
14a70 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
14a80 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
14a90 28 21 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  (!SystemTimeToFi
14aa0 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
14ab0 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  )){.    return 1
14ac0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 47 65  ;.  }.#else.  Ge
14ad0 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
14ae0 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
14af0 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
14b00 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
14b10 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
14b20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
14b30 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
14b40 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
14b50 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
14b60 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
14b70 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
14b80 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
14b90 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
14ba0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14bb0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
14bc0 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
14bd0 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
14be0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
14bf0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
14c00 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
14c10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
14c20 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
14c30 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
14c40 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  0;.}../*.** Find
14c50 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
14c60 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
14c70 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
14c80 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
14c90 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
14ca0 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
14cb0 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
14cc0 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
14cd0 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
14ce0 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
14cf0 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
14d00 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
14d10 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
14d20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
14d30 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
14d40 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
14d50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
14d60 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
14d70 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
14d80 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
14d90 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
14da0 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
14db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
14dd0 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
14de0 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
14df0 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
14e00 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
14e10 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
14e20 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 77 69 6e  Message() on win
14e30 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
14e40 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
14e50 28 29 20 6f 6e 20 75 6e 69 78 29 2e 20 41 66 74  () on unix). Aft
14e60 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
14e70 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
14e80 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
14e90 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
14ea0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
14eb0 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
14ec0 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
14ed0 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
14ee0 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
14ef0 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
14f00 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
14f10 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
14f20 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
14f30 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
14f40 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
14f50 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
14f60 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
14f70 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
14f80 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
14f90 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
14fa0 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
14fb0 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
14fc0 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
14fd0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
14fe0 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
14ff0 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
15000 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
15010 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
15020 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
15030 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
15040 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
15050 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
15060 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
15070 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
15080 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
15090 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
150a0 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
150b0 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
150c0 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
150d0 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
150e0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
150f0 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
15100 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
15110 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
15120 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
15130 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
15140 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
15150 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
15160 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
15170 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
15180 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
15190 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
151a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
151b0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
151c0 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
151d0 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
151e0 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
151f0 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
15200 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
15210 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
15220 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
15230 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
15240 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
15250 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
15260 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
15270 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
15280 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
15290 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
152a0 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
152b0 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
152c0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
152d0 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
152e0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
152f0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
15300 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
15310 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
15320 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  Vfs);.  return g
15330 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6e  etLastErrorMsg(n
15340 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 0a  Buf, zBuf);.}...
15350 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
15360 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
15370 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
15380 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
15390 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
153a0 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
153b0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
153c0 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
153d0 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
153e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
153f0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
15400 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
15410 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
15420 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20  .    MAX_PATH,  
15430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
15440 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
15450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15460 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
15470 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
15480 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
15490 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
154b0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
154c0 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
154d0 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
154e0 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
154f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
15500 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
15510 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
15520 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
15530 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
15540 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
15550 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
15560 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
15570 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
15580 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
15590 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
155a0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
155b0 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
155c0 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
155d0 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
155e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
155f0 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
15600 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
15610 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
15620 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
15630 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15640 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
15650 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
15660 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
15670 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
15680 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
15690 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
156a0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
156b0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
156c0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
156d0 34 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  4 */.    0,     
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
156f0 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
15700 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
15710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
15720 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
15730 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
15740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
15750 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
15760 20 20 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51    };..#ifndef SQ
15770 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
15780 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
15790 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
157a0 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
157b0 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
157c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
157d0 45 4d 5f 49 4e 46 4f 29 29 3b 0a 20 20 47 65 74  EM_INFO));.  Get
157e0 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
157f0 79 73 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  ysInfo);.  asser
15800 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  t(winSysInfo.dwA
15810 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
15820 72 69 74 79 20 3e 20 30 29 3b 0a 23 65 6e 64 69  rity > 0);.#endi
15830 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  f..  sqlite3_vfs
15840 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66  _register(&winVf
15850 73 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  s, 1);.  return 
15860 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 69 6e  SQLITE_OK; .}.in
15870 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
15880 28 76 6f 69 64 29 7b 20 0a 20 20 72 65 74 75 72  (void){ .  retur
15890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
158a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
158b0 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.