/ Hex Artifact Content
Login

Artifact 73608839342de32280cb378d3c2fc85a5dd80bd2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 77 69 6e 64 6f 77 73 2e  ific to windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 77 69 6e 64 6f 77 73 20 6f 6e 6c 79  for windows only
0210: 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 4e 6f   */.../*.** A No
0220: 74 65 20 41 62 6f 75 74 20 4d 65 6d 6f 72 79 20  te About Memory 
0230: 41 6c 6c 6f 63 61 74 69 6f 6e 3a 0a 2a 2a 0a 2a  Allocation:.**.*
0240: 2a 20 54 68 69 73 20 64 72 69 76 65 72 20 75 73  * This driver us
0250: 65 73 20 6d 61 6c 6c 6f 63 28 29 2f 66 72 65 65  es malloc()/free
0260: 28 29 20 64 69 72 65 63 74 6c 79 20 72 61 74 68  () directly rath
0270: 65 72 20 74 68 61 6e 20 67 6f 69 6e 67 20 74 68  er than going th
0280: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 53 51 4c  rough.** the SQL
0290: 69 74 65 2d 77 72 61 70 70 65 72 73 20 73 71 6c  ite-wrappers sql
02a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2f 73 71  ite3_malloc()/sq
02b0: 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 20 20 54  lite3_free().  T
02c0: 68 6f 73 65 20 77 72 61 70 70 65 72 73 0a 2a 2a  hose wrappers.**
02d0: 20 61 72 65 20 64 65 73 69 67 6e 65 64 20 66 6f   are designed fo
02e0: 72 20 75 73 65 20 6f 6e 20 65 6d 62 65 64 64 65  r use on embedde
02f0: 64 20 73 79 73 74 65 6d 73 20 77 68 65 72 65 20  d systems where 
0300: 6d 65 6d 6f 72 79 20 69 73 20 73 63 61 72 63 65  memory is scarce
0310: 20 61 6e 64 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 66   and.** malloc f
0320: 61 69 6c 75 72 65 73 20 68 61 70 70 65 6e 20 66  ailures happen f
0330: 72 65 71 75 65 6e 74 6c 79 2e 20 20 57 69 6e 33  requently.  Win3
0340: 32 20 64 6f 65 73 20 6e 6f 74 20 74 79 70 69 63  2 does not typic
0350: 61 6c 6c 79 20 72 75 6e 20 6f 6e 0a 2a 2a 20 65  ally run on.** e
0360: 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73 2c  mbedded systems,
0370: 20 61 6e 64 20 77 68 65 6e 20 69 74 20 64 6f 65   and when it doe
0380: 73 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  s the developers
0390: 20 6e 6f 72 6d 61 6c 6c 79 20 68 61 76 65 20 62   normally have b
03a0: 69 67 67 65 72 0a 2a 2a 20 70 72 6f 62 6c 65 6d  igger.** problem
03b0: 73 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74  s to worry about
03c0: 20 74 68 61 6e 20 72 75 6e 6e 69 6e 67 20 6f 75   than running ou
03d0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 53 6f  t of memory.  So
03e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 0a 2a 2a   there is not.**
03f0: 20 61 20 63 6f 6d 70 65 6c 6c 69 6e 67 20 6e 65   a compelling ne
0400: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 77 72  ed to use the wr
0410: 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 42 75  appers..**.** Bu
0420: 74 20 74 68 65 72 65 20 69 73 20 61 20 67 6f 6f  t there is a goo
0430: 64 20 72 65 61 73 6f 6e 20 74 6f 20 6e 6f 74 20  d reason to not 
0440: 75 73 65 20 74 68 65 20 77 72 61 70 70 65 72 73  use the wrappers
0450: 2e 20 20 49 66 20 77 65 20 75 73 65 20 74 68 65  .  If we use the
0460: 0a 2a 2a 20 77 72 61 70 70 65 72 73 20 74 68 65  .** wrappers the
0470: 6e 20 77 65 20 77 69 6c 6c 20 67 65 74 20 73 69  n we will get si
0480: 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63 28 29  mulated malloc()
0490: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
04a0: 20 74 68 69 73 0a 2a 2a 20 64 72 69 76 65 72 2e   this.** driver.
04b0: 20 20 41 6e 64 20 74 68 61 74 20 63 61 75 73 65    And that cause
04c0: 73 20 61 6c 6c 20 6b 69 6e 64 73 20 6f 66 20 70  s all kinds of p
04d0: 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 75 72 20  roblems for our 
04e0: 74 65 73 74 73 2e 20 20 57 65 0a 2a 2a 20 63 6f  tests.  We.** co
04f0: 75 6c 64 20 65 6e 68 61 6e 63 65 20 53 51 4c 69  uld enhance SQLi
0500: 74 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  te to deal with 
0510: 73 69 6d 75 6c 61 74 65 64 20 6d 61 6c 6c 6f 63  simulated malloc
0520: 20 66 61 69 6c 75 72 65 73 20 77 69 74 68 69 6e   failures within
0530: 0a 2a 2a 20 74 68 65 20 4f 53 20 64 72 69 76 65  .** the OS drive
0540: 72 2c 20 62 75 74 20 74 68 65 20 63 6f 64 65 20  r, but the code 
0550: 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 6f  to deal with tho
0560: 73 65 20 66 61 69 6c 75 72 65 20 77 6f 75 6c 64  se failure would
0570: 20 6e 6f 74 0a 2a 2a 20 62 65 20 65 78 65 72 63   not.** be exerc
0580: 69 73 65 64 20 6f 6e 20 4c 69 6e 75 78 20 28 77  ised on Linux (w
0590: 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 6e 65  hich does not ne
05a0: 65 64 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 69  ed to malloc() i
05b0: 6e 20 74 68 65 20 64 72 69 76 65 72 29 0a 2a 2a  n the driver).**
05c0: 20 61 6e 64 20 73 6f 20 77 65 20 77 6f 75 6c 64   and so we would
05d0: 20 68 61 76 65 20 64 69 66 66 69 63 75 6c 74 79   have difficulty
05e0: 20 77 72 69 74 69 6e 67 20 63 6f 76 65 72 61 67   writing coverag
05f0: 65 20 74 65 73 74 73 20 66 6f 72 20 74 68 61 74  e tests for that
0600: 0a 2a 2a 20 63 6f 64 65 2e 20 20 42 65 74 74 65  .** code.  Bette
0610: 72 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  r to leave the c
0620: 6f 64 65 20 6f 75 74 2c 20 77 65 20 74 68 69 6e  ode out, we thin
0630: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  k..**.** The poi
0640: 6e 74 20 6f 66 20 74 68 69 73 20 64 69 73 63 75  nt of this discu
0650: 73 73 69 6f 6e 20 69 73 20 61 73 20 66 6f 6c 6c  ssion is as foll
0660: 6f 77 73 3a 20 20 57 68 65 6e 20 63 72 65 61 74  ows:  When creat
0670: 69 6e 67 20 61 20 6e 65 77 0a 2a 2a 20 4f 53 20  ing a new.** OS 
0680: 6c 61 79 65 72 20 66 6f 72 20 61 6e 20 65 6d 62  layer for an emb
0690: 65 64 64 65 64 20 73 79 73 74 65 6d 2c 20 69 66  edded system, if
06a0: 20 79 6f 75 20 75 73 65 20 74 68 69 73 20 66 69   you use this fi
06b0: 6c 65 20 61 73 20 61 6e 20 65 78 61 6d 70 6c 65  le as an example
06c0: 2c 0a 2a 2a 20 61 76 6f 69 64 20 74 68 65 20 75  ,.** avoid the u
06d0: 73 65 20 6f 66 20 6d 61 6c 6c 6f 63 28 29 2f 66  se of malloc()/f
06e0: 72 65 65 28 29 2e 20 20 54 68 6f 73 65 20 72 6f  ree().  Those ro
06f0: 75 74 69 6e 65 73 20 77 6f 72 6b 20 6f 6b 20 6f  utines work ok o
0700: 6e 20 77 69 6e 64 6f 77 73 0a 2a 2a 20 64 65 73  n windows.** des
0710: 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74 20 73 6f  ktops but not so
0720: 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65 64 64 65   well in embedde
0730: 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 0a 23  d systems..*/..#
0740: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65  include <winbase
0750: 2e 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59  .h>..#ifdef __CY
0760: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0770: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0780: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0790: 63 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74  cros used to det
07a0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
07b0: 72 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72  r not to use thr
07c0: 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  eads..*/.#if def
07d0: 69 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29  ined(THREADSAFE)
07e0: 20 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23   && THREADSAFE.#
07f0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0800: 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  32_THREADS 1.#en
0810: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75  dif../*.** Inclu
0820: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0830: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0840: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0850: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0860: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  n.h"../*.** Some
0870: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
0880: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
0890: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
08a0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49  fndef INVALID_FI
08b0: 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20  LE_ATTRIBUTES.# 
08c0: 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46  define INVALID_F
08d0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 28  ILE_ATTRIBUTES (
08e0: 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64  (DWORD)-1) .#end
08f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  if../*.** Determ
0900: 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64 65  ine if we are de
0910: 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64 6f  aling with Windo
0920: 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61 73  wsCE - which has
0930: 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75 63   a much.** reduc
0940: 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53  ed API..*/.#if S
0950: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
0960: 20 64 65 66 69 6e 65 20 41 72 65 46 69 6c 65 41   define AreFileA
0970: 70 69 73 41 4e 53 49 28 29 20 31 0a 23 20 64 65  pisANSI() 1.# de
0980: 66 69 6e 65 20 46 6f 72 6d 61 74 4d 65 73 73 61  fine FormatMessa
0990: 67 65 57 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 2c  geW(a,b,c,d,e,f,
09a0: 67 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  g) 0.#endif../* 
09b0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
09c0: 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  es */.typedef st
09d0: 72 75 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53  ruct winShm winS
09e0: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
09f0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   A connection to
0a00: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a   shared-memory *
0a10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0a20: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53   winShmNode winS
0a30: 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72  hmNode;   /* A r
0a40: 65 67 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d  egion of shared-
0a50: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  memory */../*.**
0a60: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
0a70: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
0a80: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
0a90: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
0aa0: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
0ab0: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
0ac0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
0ad0: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
0ae0: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
0af0: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
0b00: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
0b10: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
0b20: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
0b30: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
0b40: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
0b50: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
0b60: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
0b70: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
0b80: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
0b90: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
0ba0: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
0bb0: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
0bc0: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
0bd0: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
0be0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0bf0: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
0c00: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
0c10: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
0c20: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
0c30: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
0c40: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
0c50: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
0c60: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
0c70: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
0c80: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
0c90: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
0ca0: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
0cb0: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
0cc0: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
0cd0: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
0ce0: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
0cf0: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
0d00: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
0d10: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
0d20: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
0d30: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
0d60: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
0d70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
0d80: 72 20 6c 6f 63 6b 74 79 70 65 3b 20 2f 2a 20 54  r locktype; /* T
0d90: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
0da0: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
0db0: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
0dc0: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
0dd0: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
0de0: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
0df0: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
0e00: 63 6b 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  ck */.  DWORD la
0e10: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
0e20: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
0e30: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
0e40: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
0e50: 20 20 44 57 4f 52 44 20 73 65 63 74 6f 72 53 69    DWORD sectorSi
0e60: 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 63  ze;       /* Sec
0e70: 74 6f 72 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tor size of the 
0e80: 64 65 76 69 63 65 20 66 69 6c 65 20 69 73 20 6f  device file is o
0e90: 6e 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  n */.  winShm *p
0ea0: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
0eb0: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
0ec0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
0ed0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  his file */.  co
0ee0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
0ef0: 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61        /* Full pa
0f00: 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73 20 66  thname of this f
0f10: 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ile */.#if SQLIT
0f20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  E_OS_WINCE.  WCH
0f30: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
0f40: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
0f50: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
0f60: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
0f70: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
0f90: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
0fa0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
0fb0: 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48  ed lock */  .  H
0fc0: 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20  ANDLE hShared;  
0fd0: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
0fe0: 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20   memory segment 
0ff0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1000: 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20   */.  winceLock 
1010: 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a  local;        /*
1020: 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20   Locks obtained 
1030: 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65  by this instance
1040: 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20   of winFile */. 
1050: 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72   winceLock *shar
1060: 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62  ed;      /* Glob
1070: 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d  al shared lock m
1080: 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69  emory for the fi
1090: 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  le  */.#endif.};
10a0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
10b0: 70 72 6f 74 6f 74 79 70 65 73 2e 0a 2a 2f 0a 73  prototypes..*/.s
10c0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 65 63  tatic int getSec
10d0: 74 6f 72 53 69 7a 65 28 0a 20 20 20 20 73 71 6c  torSize(.    sql
10e0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
10f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1100: 7a 52 65 6c 61 74 69 76 65 20 20 20 20 20 2f 2a  zRelative     /*
1110: 20 55 54 46 2d 38 20 66 69 6c 65 20 6e 61 6d 65   UTF-8 file name
1120: 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.);../*.** Th
1130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1140: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
1150: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
1160: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
1170: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
1180: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
1190: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11a0: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 35 0a 2a  ystem is Win95.*
11b0: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
11c0: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
11d0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
11e0: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
11f0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
1200: 39 35 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  95..** 2:   Oper
1210: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
1220: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
1230: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
1240: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
1250: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
1260: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
1270: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
1280: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
1290: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
12a0: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
12b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12c0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
12d0: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
12e0: 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 73  lse.static int s
12f0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
1300: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1310: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e  * Return true (n
1320: 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61  on-zero) if we a
1330: 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72  re running under
1340: 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57   WinNT, Win2K, W
1350: 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43  inXP,.** or WinC
1360: 45 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  E.  Return false
1370: 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39   (zero) for Win9
1380: 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e  5, Win98, or Win
1390: 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69  ME..**.** Here i
13a0: 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67  s an interesting
13b0: 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57   observation:  W
13c0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64  in95, Win98, and
13d0: 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74   WinME lack.** t
13e0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
13f0: 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e  API.  But we can
1400: 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c   still staticall
1410: 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  y link against t
1420: 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f  hat.** API as lo
1430: 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63  ng as we don't c
1440: 61 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e  all it when runn
1450: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
1460: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
1470: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
1480: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
1490: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
14a0: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
14b0: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
14c0: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
14d0: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
14e0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
14f0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
1500: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
1510: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1520: 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20 69 73  INCE.# define is
1530: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73 65 0a  NT()  (1).#else.
1540: 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e    static int isN
1550: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
1560: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
1570: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 56  ==0 ){.      OSV
1580: 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e 66 6f  ERSIONINFO sInfo
1590: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
15a0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
15b0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
15c0: 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65 72 73  );.      GetVers
15d0: 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20  ionEx(&sInfo);. 
15e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
15f0: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
1600: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
1610: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
1620: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
1630: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1640: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
1650: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1660: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
1670: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1680: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
1690: 20 6d 69 63 72 6f 73 6f 66 74 20 75 6e 69 63 6f   microsoft unico
16a0: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
16b0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
16c0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
16d0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
16e0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
16f0: 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52 20  */.static WCHAR 
1700: 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  *utf8ToUnicode(c
1710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1720: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
1730: 61 72 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69  ar;.  WCHAR *zWi
1740: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
1750: 43 68 61 72 20 3d 20 4d 75 6c 74 69 42 79 74 65  Char = MultiByte
1760: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
1770: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
1780: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
1790: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
17a0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 68 61 72 2a  = malloc( nChar*
17b0: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
17c0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
17d0: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
17e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
17f0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
1800: 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  = MultiByteToWid
1810: 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30  eChar(CP_UTF8, 0
1820: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
1830: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
1840: 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43  nChar);.  if( nC
1850: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72  har==0 ){.    fr
1860: 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  ee(zWideFilename
1870: 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65  );.    zWideFile
1880: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
1890: 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65  return zWideFile
18a0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
18b0: 6f 6e 76 65 72 74 20 6d 69 63 72 6f 73 6f 66 74  onvert microsoft
18c0: 20 75 6e 69 63 6f 64 65 20 74 6f 20 55 54 46 2d   unicode to UTF-
18d0: 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
18e0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
18f0: 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61  tring is.** obta
1900: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
1910: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
1920: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66  ar *unicodeToUtf
1930: 38 28 63 6f 6e 73 74 20 57 43 48 41 52 20 2a 7a  8(const WCHAR *z
1940: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
1950: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
1960: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
1970: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1980: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1990: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
19a0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
19b0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c  0, 0, 0);.  zFil
19c0: 65 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  ename = malloc( 
19d0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
19e0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
19f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1a00: 0a 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43  .  nByte = WideC
1a10: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
1a20: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
1a30: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
1a40: 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a  ilename, nByte,.
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
1a70: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
1a80: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65   == 0 ){.    fre
1a90: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1aa0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
1ab0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
1ac0: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
1ad0: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 61 6e 73  * Convert an ans
1ae0: 69 20 73 74 72 69 6e 67 20 74 6f 20 6d 69 63 72  i string to micr
1af0: 6f 73 6f 66 74 20 75 6e 69 63 6f 64 65 2c 20 62  osoft unicode, b
1b00: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
1b10: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
1b20: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
1b30: 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53  e apis..** .** S
1b40: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1b50: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
1b60: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
1b70: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
1b80: 73 74 61 74 69 63 20 57 43 48 41 52 20 2a 6d 62  static WCHAR *mb
1b90: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
1ba0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1bb0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
1bc0: 0a 20 20 57 43 48 41 52 20 2a 7a 4d 62 63 73 46  .  WCHAR *zMbcsF
1bd0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
1be0: 6f 64 65 70 61 67 65 20 3d 20 41 72 65 46 69 6c  odepage = AreFil
1bf0: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
1c00: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b  _ACP : CP_OEMCP;
1c10: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74  ..  nByte = Mult
1c20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
1c30: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
1c40: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
1c50: 2c 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  ,0)*sizeof(WCHAR
1c60: 29 3b 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  );.  zMbcsFilena
1c70: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1c80: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
1c90: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
1ca0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
1cb0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
1cc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
1cd0: 74 65 20 3d 20 4d 75 6c 74 69 42 79 74 65 54 6f  te = MultiByteTo
1ce0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
1cf0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
1d00: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
1d10: 6d 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  me, nByte);.  if
1d20: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
1d30: 20 20 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65    free(zMbcsFile
1d40: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
1d50: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
1d60: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
1d70: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
1d80: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 69 63 72 6f  ** Convert micro
1d90: 73 6f 66 74 20 75 6e 69 63 6f 64 65 20 74 6f 20  soft unicode to 
1da0: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
1db0: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
1dc0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
1dd0: 27 73 20 41 6e 73 69 20 63 6f 64 65 70 61 67 65  's Ansi codepage
1de0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
1df0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
1e00: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
1e10: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 6d 61  ained from.** ma
1e20: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
1e30: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
1e40: 6f 4d 62 63 73 28 63 6f 6e 73 74 20 57 43 48 41  oMbcs(const WCHA
1e50: 52 20 2a 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  R *zWideFilename
1e60: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
1e70: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
1e80: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
1e90: 65 20 3d 20 41 72 65 46 69 6c 65 41 70 69 73 41  e = AreFileApisA
1ea0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
1eb0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
1ec0: 79 74 65 20 3d 20 57 69 64 65 43 68 61 72 54 6f  yte = WideCharTo
1ed0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
1ee0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
1ef0: 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20  name, -1, 0, 0, 
1f00: 30 2c 20 30 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  0, 0);.  zFilena
1f10: 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 42 79  me = malloc( nBy
1f20: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
1f30: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
1f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1f50: 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68 61 72  nByte = WideChar
1f60: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
1f70: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
1f80: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
1f90: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
1fc0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
1fd0: 3d 20 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  = 0 ){.    free(
1fe0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
1ff0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2000: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
2010: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
2020: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
2030: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
2040: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
2050: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
2060: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
2070: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
2080: 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  rom malloc()..*/
2090: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
20a0: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
20b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
20c0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
20d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
20e0: 0a 20 20 57 43 48 41 52 20 2a 7a 54 6d 70 57 69  .  WCHAR *zTmpWi
20f0: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
2100: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
2110: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
2120: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
2130: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2140: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
2150: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
2160: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
2170: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
2180: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
2190: 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meUtf8;.}../*.**
21a0: 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74   Convert UTF-8 t
21b0: 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  o multibyte char
21c0: 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53  acter string.  S
21d0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
21e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74   .** returned st
21f0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
2200: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 0a   from malloc()..
2210: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
2220: 75 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74  utf8ToMbcs(const
2230: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2240: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
2250: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 57 43 48 41  nameMbcs;.  WCHA
2260: 52 20 2a 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  R *zTmpWide;..  
2270: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
2280: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
2290: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
22a0: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
22b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
22c0: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
22d0: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
22e0: 57 69 64 65 29 3b 0a 20 20 66 72 65 65 28 7a 54  Wide);.  free(zT
22f0: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
2300: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
2310: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2320: 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  S_WINCE./*******
2330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69  **.** This secti
2380: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  on contains code
2390: 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e   for WinCE only.
23a0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  .*/./*.** Window
23b0: 73 43 45 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  sCE does not hav
23c0: 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
23d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 63 72  function.  So cr
23e0: 65 61 74 65 20 61 0a 2a 2a 20 73 75 62 73 74 69  eate a.** substi
23f0: 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tute..*/.#includ
2400: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
2410: 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
2420: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
2430: 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
2440: 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
2450: 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
2460: 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
2470: 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
2480: 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
2490: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
24a0: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
24b0: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
24c0: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
24d0: 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
24e0: 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
24f0: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
2500: 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
2510: 34 20 3e 3e 20 33 32 29 3b 0a 20 20 46 69 6c 65  4 >> 32);.  File
2520: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
2530: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
2540: 20 20 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74    FileTimeToSyst
2550: 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d  emTime(&lTm,&pTm
2560: 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d  );.  y.tm_year =
2570: 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30   pTm.wYear - 190
2580: 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20  0;.  y.tm_mon = 
2590: 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a  pTm.wMonth - 1;.
25a0: 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54    y.tm_wday = pT
25b0: 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20  m.wDayOfWeek;.  
25c0: 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e  y.tm_mday = pTm.
25d0: 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75  wDay;.  y.tm_hou
25e0: 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20  r = pTm.wHour;. 
25f0: 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e   y.tm_min = pTm.
2600: 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f  wMinute;.  y.tm_
2610: 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e  sec = pTm.wSecon
2620: 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a  d;.  return &y;.
2630: 7d 0a 0a 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20  }../* This will 
2640: 6e 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 2c  never be called,
2650: 20 62 75 74 20 64 65 66 69 6e 65 64 20 74 6f 20   but defined to 
2660: 6d 61 6b 65 20 74 68 65 20 63 6f 64 65 20 63 6f  make the code co
2670: 6d 70 69 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  mpile */.#define
2680: 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 61 2c   GetTempPathA(a,
2690: 62 29 0a 0a 23 64 65 66 69 6e 65 20 4c 6f 63 6b  b)..#define Lock
26a0: 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65 29 20  File(a,b,c,d,e) 
26b0: 20 20 20 20 20 20 77 69 6e 63 65 4c 6f 63 6b 46        winceLockF
26c0: 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20 64 2c  ile(&a, b, c, d,
26d0: 20 65 29 0a 23 64 65 66 69 6e 65 20 55 6e 6c 6f   e).#define Unlo
26e0: 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c 65  ckFile(a,b,c,d,e
26f0: 29 20 20 20 20 20 77 69 6e 63 65 55 6e 6c 6f 63  )     winceUnloc
2700: 6b 46 69 6c 65 28 26 61 2c 20 62 2c 20 63 2c 20  kFile(&a, b, c, 
2710: 64 2c 20 65 29 0a 23 64 65 66 69 6e 65 20 4c 6f  d, e).#define Lo
2720: 63 6b 46 69 6c 65 45 78 28 61 2c 62 2c 63 2c 64  ckFileEx(a,b,c,d
2730: 2c 65 2c 66 29 20 20 20 77 69 6e 63 65 4c 6f 63  ,e,f)   winceLoc
2740: 6b 46 69 6c 65 45 78 28 26 61 2c 20 62 2c 20 63  kFileEx(&a, b, c
2750: 2c 20 64 2c 20 65 2c 20 66 29 0a 0a 23 64 65 66  , d, e, f)..#def
2760: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
2770: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
2780: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
2790: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
27a0: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
27b0: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
27c0: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
27d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
27e0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
27f0: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
2800: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
2810: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
2820: 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62   WaitForSingleOb
2830: 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45  ject(h, INFINITE
2840: 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64  );.   } while (d
2850: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a  wErr != WAIT_OBJ
2860: 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21  ECT_0 && dwErr !
2870: 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44  = WAIT_ABANDONED
2880: 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  );.}./*.** Relea
2890: 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72  se a lock acquir
28a0: 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78  ed by winceMutex
28b0: 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65  Acquire().*/.#de
28c0: 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52  fine winceMutexR
28d0: 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73  elease(h) Releas
28e0: 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a  eMutex(h)../*.**
28f0: 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65   Create the mute
2900: 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d  x and shared mem
2910: 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ory used for loc
2920: 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65  king in the file
2930: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
2940: 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42  File.*/.static B
2950: 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74 65 4c  OOL winceCreateL
2960: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
2970: 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
2980: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 57 43  le *pFile){.  WC
2990: 48 41 52 20 2a 7a 54 6f 6b 3b 0a 20 20 57 43 48  HAR *zTok;.  WCH
29a0: 41 52 20 2a 7a 4e 61 6d 65 20 3d 20 75 74 66 38  AR *zName = utf8
29b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
29c0: 61 6d 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e  ame);.  BOOL bIn
29d0: 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 2f 2a  it = TRUE;..  /*
29e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
29f0: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
2a00: 2f 0a 20 20 5a 65 72 6f 4d 65 6d 6f 72 79 28 26  /.  ZeroMemory(&
2a10: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 73 69  pFile->local, si
2a20: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
2a30: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
2a40: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
2a50: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
2a60: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
2a70: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
2a80: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
2a90: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 43  e. */.  zTok = C
2aa0: 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29  harLowerW(zName)
2ab0: 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b  ;.  for (;*zTok;
2ac0: 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20  zTok++){.    if 
2ad0: 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20  (*zTok == '\\') 
2ae0: 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d  *zTok = '_';.  }
2af0: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70  ..  /* Create/op
2b00: 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74  en the named mut
2b10: 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68  ex */.  pFile->h
2b20: 4d 75 74 65 78 20 3d 20 43 72 65 61 74 65 4d 75  Mutex = CreateMu
2b30: 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
2b40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
2b50: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
2b60: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
2b70: 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
2b80: 72 72 6f 72 28 29 3b 0a 20 20 20 20 66 72 65 65  rror();.    free
2b90: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  (zName);.    ret
2ba0: 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  urn FALSE;.  }..
2bb0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
2bc0: 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
2bd0: 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
2be0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
2bf0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
2c00: 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68    .  /* Since th
2c10: 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64  e names of named
2c20: 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68   mutexes, semaph
2c30: 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69  ores, file mappi
2c40: 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a  ngs etc are .  *
2c50: 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
2c60: 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
2c70: 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
2c80: 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
2c90: 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
2ca0: 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
2cb0: 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
2cc0: 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
2cd0: 20 20 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61    CharUpperW(zNa
2ce0: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
2cf0: 68 61 72 65 64 20 3d 20 43 72 65 61 74 65 46 69  hared = CreateFi
2d00: 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
2d10: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
2d20: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2d50: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
2d60: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
2d70: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
2da0: 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61  );  ..  /* Set a
2db0: 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
2dc0: 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66  ates we're the f
2dd0: 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74  irst to create t
2de0: 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20  he memory so it 
2df0: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
2e00: 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
2e10: 2f 0a 20 20 69 66 20 28 47 65 74 4c 61 73 74 45  /.  if (GetLastE
2e20: 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52 5f  rror() == ERROR_
2e30: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
2e40: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
2e50: 53 45 3b 0a 20 20 7d 0a 0a 20 20 66 72 65 65 28  SE;.  }..  free(
2e60: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66  zName);..  /* If
2e70: 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e   we succeeded in
2e80: 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72   making the shar
2e90: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2ea0: 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69  , map it. */.  i
2eb0: 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  f (pFile->hShare
2ec0: 64 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  d){.    pFile->s
2ed0: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
2ee0: 63 6b 2a 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ck*)MapViewOfFil
2ef0: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
2f00: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2f10: 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49  FILE_MAP_READ|FI
2f20: 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c  LE_MAP_WRITE, 0,
2f30: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
2f40: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49  Lock));.    /* I
2f50: 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  f mapping failed
2f60: 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72  , close the shar
2f70: 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65  ed memory handle
2f80: 20 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f   and erase it */
2f90: 0a 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d  .    if (!pFile-
2fa0: 3e 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20  >shared){.      
2fb0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
2fc0: 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
2fd0: 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61  );.      CloseHa
2fe0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
2ff0: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
3000: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
3010: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
3020: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
3030: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
3040: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
3050: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
3060: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
3070: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
3080: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
3090: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
30a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30b0: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
30c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
30d0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
30e0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
30f0: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  turn FALSE;.  }.
3100: 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69    .  /* Initiali
3110: 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ze the shared me
3120: 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73 75  mory if we're su
3130: 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20 69  pposed to */.  i
3140: 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20 20 20  f (bInit) {.    
3150: 5a 65 72 6f 4d 65 6d 6f 72 79 28 70 46 69 6c 65  ZeroMemory(pFile
3160: 2d 3e 73 68 61 72 65 64 2c 20 73 69 7a 65 6f 66  ->shared, sizeof
3170: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
3180: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
3190: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
31a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
31b0: 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  TRUE;.}../*.** D
31c0: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
31d0: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
31e0: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
31f0: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
3200: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
3210: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
3220: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
3230: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
3240: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
3250: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
3260: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
3270: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
3280: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
3290: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
32a0: 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
32b0: 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
32c0: 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
32d0: 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
32e0: 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
32f0: 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
3300: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
3310: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
3320: 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
3330: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3340: 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
3350: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
3360: 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
3370: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
3380: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
3390: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
33a0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
33b0: 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
33c0: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
33d0: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
33e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
33f0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
3400: 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
3410: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
3420: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
3430: 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
3440: 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
3450: 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
3460: 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
3470: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
3480: 0a 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66  .    UnmapViewOf
3490: 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72  File(pFile->shar
34a0: 65 64 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  ed);.    CloseHa
34b0: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
34c0: 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
34d0: 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
34e0: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
34f0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
3500: 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20  ->hMutex);    . 
3510: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
3520: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
3530: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
3540: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
3550: 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  /* .** An implem
3560: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
3570: 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
3580: 66 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 77 69  f windows for wi
3590: 6e 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  nce.*/.static BO
35a0: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
35b0: 28 0a 20 20 48 41 4e 44 4c 45 20 2a 70 68 46 69  (.  HANDLE *phFi
35c0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
35d0: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
35e0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
35f0: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
3600: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
3610: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
3620: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
3630: 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
3640: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
3650: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
3660: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
3670: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
3680: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
3690: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
36a0: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
36b0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
36c0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
36d0: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
36e0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
36f0: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
3700: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
3710: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
3720: 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
3730: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
3740: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
3750: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
3760: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
3770: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
3780: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
3790: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
37a0: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
37b0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
37c0: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
37d0: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
37e0: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
37f0: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
3800: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
3810: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
3820: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
3830: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
3840: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
3850: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
3860: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
3870: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
3880: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
3890: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
38a0: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
38b0: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
38c0: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
38d0: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
38e0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
38f0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
3900: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
3910: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
3920: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
3930: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
3940: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
3950: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
3960: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
3970: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
3980: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
3990: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
39a0: 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
39b0: 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
39c0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
39d0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
39e0: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
39f0: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
3a00: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
3a10: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
3a20: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
3a30: 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
3a40: 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
3a50: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
3a60: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
3a70: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
3a80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
3a90: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
3aa0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
3ab0: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
3ac0: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
3ad0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
3ae0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
3af0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
3b00: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
3b10: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
3b20: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
3b30: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
3b40: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
3b50: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
3b60: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
3b70: 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
3b80: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
3b90: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
3ba0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
3bb0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
3bc0: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
3bd0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
3be0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
3bf0: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
3c00: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
3c10: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
3c20: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
3c30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
3c40: 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
3c50: 41 50 49 20 6f 66 20 77 69 6e 64 6f 77 73 20 66  API of windows f
3c60: 6f 72 20 77 69 6e 63 65 0a 2a 2f 0a 73 74 61 74  or wince.*/.stat
3c70: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c  ic BOOL winceUnl
3c80: 6f 63 6b 46 69 6c 65 28 0a 20 20 48 41 4e 44 4c  ockFile(.  HANDL
3c90: 45 20 2a 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  E *phFile,.  DWO
3ca0: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  RD dwFileOffsetL
3cb0: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  ow,.  DWORD dwFi
3cc0: 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  leOffsetHigh,.  
3cd0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
3ce0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c  ytesToUnlockLow,
3cf0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
3d00: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
3d10: 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
3d20: 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
3d30: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
3d40: 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
3d50: 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
3d60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3d70: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
3d80: 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
3d90: 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
3da0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
3db0: 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
3dc0: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
3dd0: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
3de0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
3df0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
3e00: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
3e10: 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20  ader lock or an 
3e20: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
3e30: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
3e40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
3e50: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b  D)SHARED_FIRST){
3e60: 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68  .    /* Did we h
3e70: 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
3e80: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66   lock? */.    if
3e90: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
3ea0: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
3eb0: 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
3ec0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
3ed0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
3ee0: 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  RED_SIZE);.     
3ef0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
3f00: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
3f10: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
3f20: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
3f30: 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
3f40: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
3f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
3f60: 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  id we just have 
3f70: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a  a reader lock? *
3f80: 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70  /.    else if (p
3f90: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
3fa0: 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73  ders){.      ass
3fb0: 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
3fc0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
3fd0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
3fe0: 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66  IZE || nNumberOf
3ff0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
4000: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
4010: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
4020: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
4030: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
4040: 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
4050: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
4060: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
4070: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
4080: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
4090: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
40a0: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
40b0: 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
40c0: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
40d0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
40e0: 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
40f0: 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72  _BYTE && nNumber
4100: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
4110: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
4120: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
4130: 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
4140: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
4150: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
4160: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
4170: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
4180: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
4190: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
41a0: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
41b0: 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
41c0: 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
41d0: 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
41e0: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
41f0: 45 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e  ERVED_BYTE && nN
4200: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
4210: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
4220: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
4230: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
4240: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
4250: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
4260: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
4270: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
4280: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
4290: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
42a0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
42b0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
42c0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
42d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
42e0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
42f0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
4300: 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
4310: 45 78 28 29 20 41 50 49 20 6f 66 20 77 69 6e 64  Ex() API of wind
4320: 6f 77 73 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2f  ows for wince.*/
4330: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
4340: 63 65 4c 6f 63 6b 46 69 6c 65 45 78 28 0a 20 20  ceLockFileEx(.  
4350: 48 41 4e 44 4c 45 20 2a 70 68 46 69 6c 65 2c 0a  HANDLE *phFile,.
4360: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 2c    DWORD dwFlags,
4370: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 73 65 72  .  DWORD dwReser
4380: 76 65 64 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  ved,.  DWORD nNu
4390: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
43a0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
43b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
43c0: 63 6b 48 69 67 68 2c 0a 20 20 4c 50 4f 56 45 52  ckHigh,.  LPOVER
43d0: 4c 41 50 50 45 44 20 6c 70 4f 76 65 72 6c 61 70  LAPPED lpOverlap
43e0: 70 65 64 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ped.){.  UNUSED_
43f0: 50 41 52 41 4d 45 54 45 52 28 64 77 52 65 73 65  PARAMETER(dwRese
4400: 72 76 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  rved);.  UNUSED_
4410: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
4420: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
4430: 67 68 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  gh);..  /* If th
4440: 65 20 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 61  e caller wants a
4450: 20 73 68 61 72 65 64 20 72 65 61 64 20 6c 6f 63   shared read loc
4460: 6b 2c 20 66 6f 72 77 61 72 64 20 74 68 69 73 20  k, forward this 
4470: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 77 69 6e  call.  ** to win
4480: 63 65 4c 6f 63 6b 46 69 6c 65 20 2a 2f 0a 20 20  ceLockFile */.  
4490: 69 66 20 28 6c 70 4f 76 65 72 6c 61 70 70 65 64  if (lpOverlapped
44a0: 2d 3e 4f 66 66 73 65 74 20 3d 3d 20 28 44 57 4f  ->Offset == (DWO
44b0: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
44c0: 26 26 0a 20 20 20 20 20 20 64 77 46 6c 61 67 73  &&.      dwFlags
44d0: 20 3d 3d 20 31 20 26 26 0a 20 20 20 20 20 20 6e   == 1 &&.      n
44e0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
44f0: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
4500: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
4510: 20 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c     return winceL
4520: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
4530: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
4540: 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
4550: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 2f 2a  turn FALSE;.}./*
4560: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
4570: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
4580: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
4590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
45d0: 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
45e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
45f0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
4600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4640: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
4650: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
4660: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
4670: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
4680: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
4690: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
46a0: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
46b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
46f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
4700: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
4710: 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
4720: 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
4730: 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
4740: 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
4750: 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
4760: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
4770: 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
4780: 74 2c 20 62 75 74 20 77 69 6e 64 6f 77 73 20 69  t, but windows i
4790: 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
47a0: 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
47b0: 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
47c0: 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
47d0: 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
47e0: 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
47f0: 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
4800: 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
4810: 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
4820: 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
4830: 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
4840: 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
4850: 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
4860: 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
4870: 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
4880: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
4890: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
48a0: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
48b0: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
48c0: 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
48d0: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
48e0: 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
48f0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
4900: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
4910: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
4920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
4930: 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20  e->pShm==0 );.  
4940: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
4950: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  %d\n", pFile->h)
4960: 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  );.  do{.    rc 
4970: 3d 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  = CloseHandle(pF
4980: 69 6c 65 2d 3e 68 29 3b 0a 20 20 7d 77 68 69 6c  ile->h);.  }whil
4990: 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
49a0: 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
49b0: 45 4d 50 54 20 26 26 20 28 53 6c 65 65 70 28 31  EMPT && (Sleep(1
49c0: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
49d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
49e0: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
49f0: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
4a00: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
4a10: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
4a20: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
4a30: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
4a40: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4a50: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
4a60: 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46    DeleteFileW(pF
4a70: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
4a80: 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ose)==0.        
4a90: 26 26 20 47 65 74 46 69 6c 65 41 74 74 72 69 62  && GetFileAttrib
4aa0: 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
4ab0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
4ac0: 66 66 66 66 66 66 66 66 20 0a 20 20 20 20 20 20  ffffffff .      
4ad0: 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e    && cnt++ < WIN
4ae0: 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
4af0: 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20  MPTS.    ){.    
4b00: 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 20 20     Sleep(100);  
4b10: 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
4b20: 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
4b30: 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
4b40: 20 20 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44    free(pFile->zD
4b50: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
4b60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
4b70: 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25  ACE(("CLOSE %d %
4b80: 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
4b90: 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
4ba0: 6c 65 64 22 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  led"));.  OpenCo
4bb0: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
4bc0: 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
4bd0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
4be0: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  R;.}../*.** Some
4bf0: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
4c00: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
4c10: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
4c20: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
4c30: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
4c40: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
4c50: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
4c60: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
4c70: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
4c80: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
4c90: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
4ca0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4cb0: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
4cc0: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
4cd0: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
4ce0: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
4cf0: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
4d00: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4d10: 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
4d20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
4d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
4d40: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
4d50: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
4d80: 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
4d90: 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
4dc0: 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
4dd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
4de0: 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
4df0: 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
4e00: 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
4e10: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
4e20: 73 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  s = (LONG)((offs
4e30: 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
4e40: 66 66 66 66 29 3b 0a 20 20 4c 4f 4e 47 20 6c 6f  ffff);.  LONG lo
4e50: 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
4e60: 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
4e70: 66 66 66 66 29 3b 0a 20 20 44 57 4f 52 44 20 72  ffff);.  DWORD r
4e80: 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  c;.  winFile *pF
4e90: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
4ea0: 69 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f  id;.  DWORD erro
4eb0: 72 3b 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a  r;.  DWORD got;.
4ec0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
4ed0: 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
4ee0: 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
4ef0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
4f00: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
4f10: 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  D %d lock=%d\n",
4f20: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
4f30: 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
4f40: 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e  rc = SetFilePoin
4f50: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
4f60: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
4f70: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
4f80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56 41  ;.  if( rc==INVA
4f90: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
4fa0: 4e 54 45 52 20 26 26 20 28 65 72 72 6f 72 3d 47  NTER && (error=G
4fb0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
4fc0: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
4fd0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
4fe0: 20 3d 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65   = error;.    re
4ff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
5000: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 61  ;.  }.  if( !Rea
5010: 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
5020: 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c  pBuf, amt, &got,
5030: 20 30 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   0) ){.    pFile
5040: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65  ->lastErrno = Ge
5050: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
5060: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5070: 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 0a  IOERR_READ;.  }.
5080: 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52    if( got==(DWOR
5090: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  D)amt ){.    ret
50a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
50b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 55   }else{.    /* U
50c0: 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
50d0: 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
50e0: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
50f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
5100: 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c  har*)pBuf)[got],
5110: 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20   0, amt-got);.  
5120: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5130: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
5140: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
5150: 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
5160: 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
5170: 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
5180: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
5190: 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
51a0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
51b0: 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
51c0: 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
51d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
51e0: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
51f0: 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69   File to write i
5200: 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  nto */.  const v
5210: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
5220: 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20     /* The bytes 
5230: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
5240: 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5260: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
5270: 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71  to write */.  sq
5280: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
5290: 65 74 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et      /* Offse
52a0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  t into the file 
52b0: 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67  to begin writing
52c0: 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 4c 4f 4e 47   at */.){.  LONG
52d0: 20 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f   upperBits = (LO
52e0: 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
52f0: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
5300: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
5310: 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
5320: 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
5330: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 69    DWORD rc;.  wi
5340: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
5350: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
5360: 57 4f 52 44 20 65 72 72 6f 72 3b 0a 20 20 44 57  WORD error;.  DW
5370: 4f 52 44 20 77 72 6f 74 65 20 3d 20 30 3b 0a 0a  ORD wrote = 0;..
5380: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
5390: 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
53a0: 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
53b0: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b  TE_IOERR_WRITE);
53c0: 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
53d0: 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20  ullError(return 
53e0: 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 20 20  SQLITE_FULL);.  
53f0: 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
5400: 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
5410: 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
5420: 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 72 63  locktype));.  rc
5430: 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   = SetFilePointe
5440: 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
5450: 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
5460: 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
5470: 20 20 69 66 28 20 72 63 3d 3d 49 4e 56 41 4c 49    if( rc==INVALI
5480: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
5490: 45 52 20 26 26 20 28 65 72 72 6f 72 3d 47 65 74  ER && (error=Get
54a0: 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
54b0: 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 70 46  _ERROR ){.    pF
54c0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
54d0: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
54e0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
54f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d    }.  assert( am
5500: 74 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 0a  t>0 );.  while(.
5510: 20 20 20 20 20 61 6d 74 3e 30 0a 20 20 20 20 20       amt>0.     
5520: 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46 69  && (rc = WriteFi
5530: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
5540: 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20  f, amt, &wrote, 
5550: 30 29 29 21 3d 30 0a 20 20 20 20 20 26 26 20 77  0))!=0.     && w
5560: 72 6f 74 65 3e 30 0a 20 20 29 7b 0a 20 20 20 20  rote>0.  ){.    
5570: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
5580: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
5590: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
55a0: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c    }.  if( !rc ||
55b0: 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20   amt>(int)wrote 
55c0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
55d0: 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
55e0: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 65  tError();.    re
55f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
5600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5610: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5620: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
5630: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
5640: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
5650: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
5660: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
5670: 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
5680: 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
5690: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
56a0: 3d 20 28 4c 4f 4e 47 29 28 28 6e 42 79 74 65 3e  = (LONG)((nByte>
56b0: 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
56c0: 66 29 3b 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72  f);.  LONG lower
56d0: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 6e 42  Bits = (LONG)(nB
56e0: 79 74 65 20 26 20 30 78 66 66 66 66 66 66 66 66  yte & 0xffffffff
56f0: 29 3b 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74  );.  DWORD dwRet
5700: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
5710: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
5720: 64 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72  d;.  DWORD error
5730: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
5740: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
5750: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53  t( id!=0 );.  OS
5760: 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
5770: 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69   %d %lld\n", pFi
5780: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a  le->h, nByte));.
5790: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
57a0: 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
57b0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
57c0: 0a 20 20 64 77 52 65 74 20 3d 20 53 65 74 46 69  .  dwRet = SetFi
57d0: 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
57e0: 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
57f0: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
5800: 42 45 47 49 4e 29 3b 0a 20 20 69 66 28 20 64 77  BEGIN);.  if( dw
5810: 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54  Ret==INVALID_SET
5820: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 26 26  _FILE_POINTER &&
5830: 20 28 65 72 72 6f 72 3d 47 65 74 4c 61 73 74 45   (error=GetLastE
5840: 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
5850: 52 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  R ){.    pFile->
5860: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f  lastErrno = erro
5870: 72 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  r;.    rc = SQLI
5880: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
5890: 45 3b 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  E;.  /* SetEndOf
58a0: 46 69 6c 65 20 77 69 6c 6c 20 66 61 69 6c 20 69  File will fail i
58b0: 66 20 6e 42 79 74 65 20 69 73 20 6e 65 67 61 74  f nByte is negat
58c0: 69 76 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ive */.  }else i
58d0: 66 28 20 21 53 65 74 45 6e 64 4f 66 46 69 6c 65  f( !SetEndOfFile
58e0: 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20 20  (pFile->h) ){.  
58f0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
5900: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
5910: 72 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  r();.    rc = SQ
5920: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
5930: 41 54 45 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ATE;.  }.  OSTRA
5940: 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64  CE(("TRUNCATE %d
5950: 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69   %lld %s\n", pFi
5960: 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63  le->h, nByte, rc
5970: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
5980: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
5990: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
59a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
59b0: 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
59c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
59d0: 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
59e0: 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
59f0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
5a00: 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
5a10: 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
5a20: 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
5a30: 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
5a40: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
5a50: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
5a60: 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
5a70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
5a80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
5a90: 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
5aa0: 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
5ab0: 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
5ac0: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
5ad0: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
5ae0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
5af0: 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
5b00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
5b10: 5f 53 59 4e 43 0a 20 20 77 69 6e 46 69 6c 65 20  _SYNC.  winFile 
5b20: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
5b30: 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
5b40: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
5b50: 52 41 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c  RACE(("SYNC %d l
5b60: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
5b70: 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
5b80: 74 79 70 65 29 29 3b 0a 23 65 6c 73 65 0a 20 20  type));.#else.  
5b90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5ba0: 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  (id);.#endif.#if
5bb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  ndef SQLITE_TEST
5bc0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
5bd0: 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73  TER(flags);.#els
5be0: 65 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  e.  if( flags & 
5bf0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
5c00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5c10: 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  fullsync_count++
5c20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5c30: 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  sync_count++;.#e
5c40: 6e 64 69 66 0a 20 20 2f 2a 20 49 66 20 77 65 20  ndif.  /* If we 
5c50: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
5c60: 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
5c70: 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
5c80: 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
5c90: 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
5ca0: 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
5cb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5cc0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  _OK;.#else.  if(
5cd0: 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72   FlushFileBuffer
5ce0: 73 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  s(pFile->h) ){. 
5cf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5d00: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
5d10: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
5d20: 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
5d30: 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
5d40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
5d50: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
5d60: 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
5d70: 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
5d80: 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a  a file in bytes.
5d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
5da0: 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  nFileSize(sqlite
5db0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
5dc0: 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  te3_int64 *pSize
5dd0: 29 7b 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72  ){.  DWORD upper
5de0: 42 69 74 73 3b 0a 20 20 44 57 4f 52 44 20 6c 6f  Bits;.  DWORD lo
5df0: 77 65 72 42 69 74 73 3b 0a 20 20 77 69 6e 46 69  werBits;.  winFi
5e00: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
5e10: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
5e20: 44 20 65 72 72 6f 72 3b 0a 0a 20 20 61 73 73 65  D error;..  asse
5e30: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53  rt( id!=0 );.  S
5e40: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
5e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5e60: 52 52 5f 46 53 54 41 54 29 3b 0a 20 20 6c 6f 77  RR_FSTAT);.  low
5e70: 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65  erBits = GetFile
5e80: 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
5e90: 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 69 66  upperBits);.  if
5ea0: 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d  (   (lowerBits =
5eb0: 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53  = INVALID_FILE_S
5ec0: 49 5a 45 29 0a 20 20 20 20 20 26 26 20 28 28 65  IZE).     && ((e
5ed0: 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74 45 72  rror = GetLastEr
5ee0: 72 6f 72 28 29 29 20 21 3d 20 4e 4f 5f 45 52 52  ror()) != NO_ERR
5ef0: 4f 52 29 20 29 0a 20 20 7b 0a 20 20 20 20 70 46  OR) ).  {.    pF
5f00: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
5f10: 20 65 72 72 6f 72 3b 0a 20 20 20 20 72 65 74 75   error;.    retu
5f20: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
5f30: 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
5f40: 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
5f50: 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
5f60: 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
5f70: 74 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ts;.  return SQL
5f80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5f90: 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
5fa0: 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
5fb0: 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
5fc0: 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
5fd0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
5fe0: 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
5ff0: 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
6000: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
6010: 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
6020: 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
6030: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
6040: 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
6050: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
6060: 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
6070: 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
6080: 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
6090: 35 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  5 or WinNT..*/.s
60a0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
60b0: 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
60c0: 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
60d0: 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
60e0: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
60f0: 20 6f 76 6c 70 3b 0a 20 20 20 20 6f 76 6c 70 2e   ovlp;.    ovlp.
6100: 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44 5f  Offset = SHARED_
6110: 46 49 52 53 54 3b 0a 20 20 20 20 6f 76 6c 70 2e  FIRST;.    ovlp.
6120: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a  OffsetHigh = 0;.
6130: 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20      ovlp.hEvent 
6140: 3d 20 30 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c  = 0;.    res = L
6150: 6f 63 6b 46 69 6c 65 45 78 28 70 46 69 6c 65 2d  ockFileEx(pFile-
6160: 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  >h, LOCKFILE_FAI
6170: 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 0a 20  L_IMMEDIATELY,. 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 30 2c 20 53 48 41 52 45 44 5f 53 49      0, SHARED_SI
61a0: 5a 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 2f  ZE, 0, &ovlp);./
61b0: 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20 69 66  * isNT() is 1 if
61c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
61d0: 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65 6c 73  ==1, so this els
61e0: 65 20 69 73 20 6e 65 76 65 72 20 65 78 65 63 75  e is never execu
61f0: 74 65 64 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c  ted. .*/.#if SQL
6200: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
6210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
6220: 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
6230: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
6240: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
6250: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
6260: 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
6270: 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
6280: 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
6290: 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
62a0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  = LockFile(pFile
62b0: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
62c0: 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
62d0: 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
62e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
62f0: 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
6300: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
6310: 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
6320: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
6330: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
6340: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
6350: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
6360: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  unlockReadLock(w
6370: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
6380: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28    int res;.  if(
6390: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72   isNT() ){.    r
63a0: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
63b0: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
63c0: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
63d0: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 2f 2a 20 69  D_SIZE, 0);./* i
63e0: 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
63f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
6400: 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
6410: 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
6420: 2e 20 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  . .*/.#if SQLITE
6430: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
6440: 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
6450: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65  UnlockFile(pFile
6460: 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
6470: 54 20 2b 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  T + pFile->share
6480: 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
6490: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
64a0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
64b0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
64c0: 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74  tErrno = GetLast
64d0: 45 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  Error();.  }.  r
64e0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
64f0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
6500: 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
6510: 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
6520: 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20  ameter locktype 
6530: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
6540: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
6550: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
6560: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
6570: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
6580: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
6590: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
65a0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
65b0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
65c0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
65d0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
65e0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
65f0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
6600: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
6610: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
6620: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
6630: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
6640: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
6650: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
6660: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
6670: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
6680: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
6690: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
66a0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
66b0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
66c0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
66d0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
66e0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
66f0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
6700: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
6710: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
6720: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
6730: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
6740: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
6750: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
6760: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
6770: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
6780: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
6790: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
67a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
67b0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
67c0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54  rease a lock.  T
67d0: 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72  he winUnlock() r
67e0: 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73  outine.** erases
67f0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e   all locks at on
6800: 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75  ce and returns u
6810: 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  s immediately to
6820: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
6830: 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  ..** It is not p
6840: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72  ossible to lower
6850: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
6860: 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61  el one step at a
6870: 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d   time.  You.** m
6880: 75 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20  ust go straight 
6890: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
68a0: 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
68b0: 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65  t winLock(sqlite
68c0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
68d0: 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
68e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
68f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6900: 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69  de from subrouti
6910: 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  nes */.  int res
6920: 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
6930: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 77  /* Result of a w
6940: 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c  indows lock call
6950: 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63   */.  int newLoc
6960: 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  ktype;       /* 
6970: 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  Set pFile->lockt
6980: 79 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ype to this valu
6990: 65 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67  e before exiting
69a0: 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e   */.  int gotPen
69b0: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20  dingLock = 0;/* 
69c0: 54 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69  True if we acqui
69d0: 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  red a PENDING lo
69e0: 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a  ck this time */.
69f0: 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
6a00: 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
6a10: 0a 20 20 44 57 4f 52 44 20 65 72 72 6f 72 20 3d  .  DWORD error =
6a20: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
6a30: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
6a40: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
6a50: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
6a60: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
6a70: 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
6a80: 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  pe, pFile->lockt
6a90: 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
6aa0: 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20  edLockByte));.. 
6ab0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
6ac0: 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
6ad0: 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
6ae0: 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
6af0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
6b00: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
6b10: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
6b20: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
6b30: 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
6b40: 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
6b50: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
6b60: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
6b70: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
6b80: 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
6b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6ba0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
6bb0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
6bc0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
6bd0: 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
6be0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
6bf0: 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
6c00: 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
6c10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
6c20: 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
6c30: 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
6c40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
6c50: 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
6c60: 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
6c70: 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
6c80: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
6c90: 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
6ca0: 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
6cb0: 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
6cc0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
6cd0: 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
6ce0: 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
6cf0: 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
6d00: 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
6d10: 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
6d20: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
6d30: 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
6d40: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
6d50: 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
6d60: 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
6d70: 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
6d80: 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
6d90: 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
6da0: 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
6db0: 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
6dc0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
6dd0: 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
6de0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
6df0: 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
6e00: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
6e10: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70  res = LockFile(p
6e20: 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
6e30: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
6e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6e50: 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
6e60: 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
6e70: 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64 69 6e  ock.  The pendin
6e80: 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 65 0a  g lock might be.
6e90: 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20 62 79        ** held by
6ea0: 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65 72 20   another reader 
6eb0: 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69 6c 6c  process who will
6ec0: 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f 6d 65   release it mome
6ed0: 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20 20 2a  ntarily..      *
6ee0: 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
6ef0: 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20  ("could not get 
6f00: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20  a PENDING lock. 
6f10: 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29  cnt=%d\n", cnt))
6f20: 3b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29  ;.      Sleep(1)
6f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
6f40: 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
6f50: 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
6f60: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
6f70: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
6f80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6f90: 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
6fa0: 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
6fb0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
6fc0: 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
6fd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
6fe0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
6ff0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
7000: 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70   = getReadLock(p
7010: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
7020: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7030: 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
7040: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
7050: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20 3d 20  {.      error = 
7060: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
7070: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7080: 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
7090: 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
70a0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
70b0: 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
70c0: 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
70d0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
70e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
70f0: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
7100: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45  ile(pFile->h, RE
7110: 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
7120: 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
7130: 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
7140: 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
7150: 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
7160: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7170: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7190: 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44  * Acquire a PEND
71a0: 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  ING lock.  */.  
71b0: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
71c0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
71d0: 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f  res ){.    newLo
71e0: 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47  cktype = PENDING
71f0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65  _LOCK;.    gotPe
7200: 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ndingLock = 0;. 
7210: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
7220: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
7230: 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
7240: 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
7250: 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
7260: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
7270: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
7280: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
7290: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
72a0: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
72b0: 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65    OSTRACE(("unre
72c0: 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20  adlock = %d\n", 
72d0: 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  res));.    res =
72e0: 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d   LockFile(pFile-
72f0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
7300: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
7310: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
7320: 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
7330: 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
7340: 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
7350: 73 65 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 20  se{.      error 
7360: 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  = GetLastError()
7370: 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
7380: 28 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25  ("error-code = %
7390: 64 5c 6e 22 2c 20 65 72 72 6f 72 29 29 3b 0a 20  d\n", error));. 
73a0: 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63 6b       getReadLock
73b0: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
73c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61   }..  /* If we a
73d0: 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e  re holding a PEN
73e0: 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f  DING lock that o
73f0: 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61  ught to be relea
7400: 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72  sed, then.  ** r
7410: 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20  elease it now.. 
7420: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e   */.  if( gotPen
7430: 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b  dingLock && lock
7440: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
7450: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7460: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45  ile(pFile->h, PE
7470: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
7480: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
7490: 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
74a0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
74b0: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
74c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
74d0: 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
74e0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
74f0: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
7500: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
7510: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
7530: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49  TRACE(("LOCK FAI
7540: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
7550: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
7560: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
7570: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
7580: 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
7590: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
75a0: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
75b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
75c0: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  BUSY;.  }.  pFil
75d0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
75e0: 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
75f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7600: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7610: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
7620: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
7630: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
7640: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
7650: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
7660: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
7670: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
7680: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
7690: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
76a0: 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
76b0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
76c0: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
76d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
76e0: 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
76f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
7700: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
7710: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
7720: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
7730: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
7740: 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
7750: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
7760: 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
7770: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
7780: 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  d %d (local)\n",
7790: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
77a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
77b0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
77c0: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
77d0: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
77e0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
77f0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
7800: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
7810: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
7820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
7830: 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  !rc;.    OSTRACE
7840: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
7850: 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e  %d %d (remote)\n
7860: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
7870: 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
7880: 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  t = rc;.  return
7890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
78a0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
78b0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
78c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
78d0: 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
78e0: 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
78f0: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
7900: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
7910: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
7920: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
7930: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
7940: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
7950: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
7960: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
7970: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
7980: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
7990: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
79a0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
79b0: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
79c0: 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
79d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
79e0: 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
79f0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
7a00: 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
7a10: 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
7a20: 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
7a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
7a40: 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERR;.*/.static i
7a50: 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c  nt winUnlock(sql
7a60: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
7a70: 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
7a80: 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46  int type;.  winF
7a90: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
7aa0: 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
7ab0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
7ad0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7ae0: 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
7af0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52  D_LOCK );.  OSTR
7b00: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20  ACE(("UNLOCK %d 
7b10: 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29  to %d was %d(%d)
7b20: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c  \n", pFile->h, l
7b30: 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20  ocktype,.       
7b40: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79     pFile->lockty
7b50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
7b60: 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74  dLockByte));.  t
7b70: 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
7b80: 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
7b90: 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_LOC
7ba0: 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  K ){.    UnlockF
7bb0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
7bc0: 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
7bd0: 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
7be0: 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
7bf0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
7c00: 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46   !getReadLock(pF
7c10: 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ile) ){.      /*
7c20: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65 76   This should nev
7c30: 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20 73  er happen.  We s
7c40: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7c50: 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  able to.      **
7c60: 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
7c70: 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead lock */.    
7c80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
7c90: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
7ca0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
7cb0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
7cc0: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
7cd0: 65 28 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  e(pFile->h, RESE
7ce0: 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
7cf0: 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
7d00: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
7d10: 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
7d20: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c  _LOCK ){.    unl
7d30: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
7d40: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  e);.  }.  if( ty
7d50: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
7d60: 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69   ){.    UnlockFi
7d70: 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  le(pFile->h, PEN
7d80: 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
7d90: 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
7da0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
7db0: 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74  )locktype;.  ret
7dc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7dd0: 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65   Control and que
7de0: 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  ry of the open f
7df0: 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
7e00: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
7e10: 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
7e20: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
7e30: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
7e40: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
7e50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
7e60: 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
7e70: 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
7e80: 70 41 72 67 20 3d 20 28 28 77 69 6e 46 69 6c 65  pArg = ((winFile
7e90: 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b  *)id)->locktype;
7ea0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7eb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
7ec0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
7ed0: 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
7ee0: 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
7ef0: 20 28 69 6e 74 29 28 28 77 69 6e 46 69 6c 65 2a   (int)((winFile*
7f00: 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  )id)->lastErrno;
7f10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
7f20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
7f30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
7f40: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
7f50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7f60: 69 6e 74 36 34 20 73 7a 20 3d 20 2a 28 73 71 6c  int64 sz = *(sql
7f70: 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
7f80: 3b 0a 20 20 20 20 20 20 77 69 6e 54 72 75 6e 63  ;.      winTrunc
7f90: 61 74 65 28 69 64 2c 20 73 7a 29 3b 0a 20 20 20  ate(id, sz);.   
7fa0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7fb0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
7fc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
7fd0: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  RROR;.}../*.** R
7fe0: 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
7ff0: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
8000: 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
8010: 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
8020: 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
8030: 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
8040: 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
8050: 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
8060: 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
8070: 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
8080: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
8090: 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
80a0: 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
80b0: 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
80c0: 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
80d0: 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
80e0: 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
80f0: 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
8100: 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
8110: 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
8120: 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
8130: 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
8140: 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
8150: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
8160: 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
8170: 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
8180: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
8190: 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  id){.  assert( i
81a0: 64 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  d!=0 );.  return
81b0: 20 28 69 6e 74 29 28 28 28 77 69 6e 46 69 6c 65   (int)(((winFile
81c0: 2a 29 69 64 29 2d 3e 73 65 63 74 6f 72 53 69 7a  *)id)->sectorSiz
81d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
81e0: 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
81f0: 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
8200: 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
8210: 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
8220: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
8230: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
8240: 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
8250: 45 54 45 52 28 69 64 29 3b 0a 20 20 72 65 74 75  ETER(id);.  retu
8260: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
8270: 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
8280: 5f 4f 50 45 4e 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  _OPEN;.}../*****
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 53 68 61 72 65 64  ********* Shared
8300: 20 4d 65 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a   Memory ********
8310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8320: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
8330: 6e 65 78 74 20 73 75 62 64 69 76 69 73 69 6f 6e  next subdivision
8340: 20 6f 66 20 63 6f 64 65 20 6d 61 6e 61 67 65 73   of code manages
8350: 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
8360: 72 79 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  ry primitives..*
8370: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8380: 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a  _OMIT_WAL../*.**
8390: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
83a0: 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
83b0: 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
83c0: 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
83d0: 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
83e0: 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
83f0: 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49  ect the winLockI
8400: 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64  nfo objects used
8410: 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c   by .** this fil
8420: 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20  e, all of which 
8430: 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79  may be shared by
8440: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
8450: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
8460: 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  n winShmMutexHel
8470: 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  d() is used to a
8480: 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
8490: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a   global mutex .*
84a0: 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
84b0: 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
84c0: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
84d0: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
84e0: 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
84f0: 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a  ements. e.g..**.
8500: 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  **   winShmEnter
8510: 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61  Mutex().**     a
8520: 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74  ssert( winShmMut
8530: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
8540: 20 77 69 6e 45 6e 74 65 72 4c 65 61 76 65 28 29   winEnterLeave()
8550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8560: 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
8570: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
8580: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
8590: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
85a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
85b0: 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
85c0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
85d0: 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
85e0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
85f0: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
8600: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
8610: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
8620: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
8630: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8640: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
8650: 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
8660: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
8670: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
8680: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
8690: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
86a0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
86b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
86c0: 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
86d0: 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
86e0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
86f0: 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
8700: 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
8710: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
8720: 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
8730: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
8740: 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
8750: 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
8760: 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
8770: 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
8780: 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
8790: 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
87a0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
87b0: 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
87c0: 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
87d0: 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
87e0: 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
87f0: 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
8800: 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
8810: 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
8820: 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
8830: 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
8840: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
8850: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
8860: 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
8870: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
8880: 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
8890: 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
88a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
88b0: 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
88c0: 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
88d0: 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
88e0: 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
88f0: 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
8900: 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
8910: 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
8920: 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
8930: 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
8940: 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
8950: 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
8960: 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
8970: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
8980: 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
8990: 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
89a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  ture..**.** To a
89b0: 76 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c 20  void deadlocks, 
89c0: 6d 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78 42  mutex and mutexB
89d0: 75 66 20 61 72 65 20 61 6c 77 61 79 73 20 72 65  uf are always re
89e0: 6c 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a 2a  leased in the.**
89f0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74   reverse order t
8a00: 68 61 74 20 74 68 65 79 20 61 72 65 20 61 63 71  hat they are acq
8a10: 75 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75 66  uired.  mutexBuf
8a20: 20 69 73 20 61 6c 77 61 79 73 20 61 63 71 75 69   is always acqui
8a30: 72 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64  red.** first and
8a40: 20 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e 20   released last. 
8a50: 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   This invariant 
8a60: 69 73 20 63 68 65 63 6b 20 62 79 20 61 73 73 65  is check by asse
8a70: 72 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  rting.** sqlite3
8a80: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29  _mutex_notheld()
8a90: 20 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65 76   on mutex whenev
8aa0: 65 72 20 6d 75 74 65 78 42 75 66 20 69 73 20 61  er mutexBuf is a
8ab0: 63 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72 65  cquired or.** re
8ac0: 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75 63  leased..*/.struc
8ad0: 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
8ae0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
8af0: 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
8b00: 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
8b10: 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
8b20: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
8b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
8b40: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
8b50: 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
8b60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
8b70: 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
8b80: 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
8b90: 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8bb0: 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
8bc0: 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
8bd0: 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bf0: 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
8c00: 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
8c10: 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
8c20: 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8c40: 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
8c50: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8c60: 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
8c70: 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
8c80: 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
8c90: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
8ca0: 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
8cb0: 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
8cc0: 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
8cd0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
8d00: 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
8d10: 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
8d20: 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
8d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
8d40: 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
8d50: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
8d60: 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
8d70: 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
8d80: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
8d90: 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
8da0: 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
8db0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8dc0: 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
8dd0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8de0: 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
8df0: 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
8e00: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
8e10: 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
8e20: 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
8e30: 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
8e40: 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
8e50: 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
8e60: 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
8e70: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
8e80: 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
8e90: 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
8ea0: 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
8eb0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
8ec0: 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
8ed0: 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
8ee0: 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
8ef0: 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
8f00: 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
8f10: 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
8f20: 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 46 69  **.** winShm.pFi
8f30: 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62  le->mutex must b
8f40: 65 20 68 65 6c 64 20 77 68 69 6c 65 20 72 65 61  e held while rea
8f50: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
8f60: 74 68 65 0a 2a 2a 20 77 69 6e 53 68 6d 2e 70 4e  the.** winShm.pN
8f70: 65 78 74 20 61 6e 64 20 77 69 6e 53 68 6d 2e 6c  ext and winShm.l
8f80: 6f 63 6b 73 5b 5d 20 65 6c 65 6d 65 6e 74 73 2e  ocks[] elements.
8f90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
8fa0: 6d 2e 70 46 69 6c 65 20 65 6c 65 6d 65 6e 74 20  m.pFile element 
8fb0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  is initialized w
8fc0: 68 65 6e 20 74 68 65 20 6f 62 6a 65 63 74 20 69  hen the object i
8fd0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
8fe0: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68   is read-only th
8ff0: 65 72 65 61 66 74 65 72 2e 0a 2a 2f 0a 73 74 72  ereafter..*/.str
9000: 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77  uct winShm {.  w
9010: 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
9020: 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ode;      /* The
9030: 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53   underlying winS
9040: 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
9050: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74  .  winShm *pNext
9060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9070: 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74   Next winShm wit
9080: 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68  h the same winSh
9090: 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
90a0: 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
90b0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
90c0: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e   holding the win
90d0: 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
90e0: 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 42 75  .  u8 hasMutexBu
90f0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
9100: 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
9110: 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66   pFile->mutexBuf
9120: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
9130: 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b  E_DEBUG.  u8 id;
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
9160: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
9170: 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64  th its winShmNod
9180: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
9190: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
91a0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
91b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f  .*/.#define WIN_
91c0: 53 48 4d 5f 42 41 53 45 20 20 20 28 28 31 38 2b  SHM_BASE   ((18+
91d0: 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
91e0: 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66  )*4)        /* f
91f0: 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
9200: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
9210: 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48  M_DMS    (WIN_SH
9220: 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
9230: 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
9240: 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
9250: 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
9260: 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
9270: 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
9280: 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
9290: 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e  .#define _SHM_UN
92a0: 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f  LCK  1.#define _
92b0: 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65  SHM_RDLCK  2.#de
92c0: 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  fine _SHM_WRLCK 
92d0: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
92e0: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  nShmSystemLock(.
92f0: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46    winShmNode *pF
9300: 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79  ile,    /* Apply
9310: 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
9320: 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
9330: 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
9340: 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
9350: 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c       /* _SHM_UNL
9360: 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  CK, _SHM_RDLCK, 
9370: 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f  or _SHM_WRLCK */
9380: 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
9390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
93a0: 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
93b0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e   to be locked/un
93c0: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
93d0: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
93e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
93f0: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  ytes to lock or 
9400: 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 4f  unlock */.){.  O
9410: 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
9420: 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 3b    DWORD dwFlags;
9430: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
9440: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
9450: 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63  lt code form Loc
9460: 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29  k/UnlockFileEx()
9470: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73   */..  /* Access
9480: 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f   to the winShmNo
9490: 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72  de object is ser
94a0: 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63  ialized by the c
94b0: 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  aller */.  asser
94c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
94d0: 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74  _held(pFile->mut
94e0: 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52  ex) || pFile->nR
94f0: 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ef==0 );..  /* I
9500: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
9510: 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
9520: 20 2a 2f 0a 20 20 64 77 46 6c 61 67 73 20 3d 20   */.  dwFlags = 
9530: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
9540: 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 69 66 28  MEDIATELY;.  if(
9550: 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48   lockType == _SH
9560: 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67  M_WRLCK ) dwFlag
9570: 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  s |= LOCKFILE_EX
9580: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 0a 20  CLUSIVE_LOCK;.. 
9590: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72   /* Find the fir
95a0: 73 74 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61  st bit in lockMa
95b0: 73 6b 20 74 68 61 74 20 69 73 20 73 65 74 20 2a  sk that is set *
95c0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70  /.  memset(&ovlp
95d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
95e0: 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 6c 70  LAPPED));.  ovlp
95f0: 2e 4f 66 66 73 65 74 20 3d 20 6f 66 73 74 3b 0a  .Offset = ofst;.
9600: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63  .  /* Release/Ac
9610: 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d  quire the system
9620: 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20  -level lock */. 
9630: 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f   if( lockType==_
9640: 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  SHM_UNLCK ){.   
9650: 20 72 63 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65   rc = UnlockFile
9660: 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  Ex(pFile->hFile.
9670: 68 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 2c 20  h, 0, nByte, 0, 
9680: 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
9690: 0a 20 20 20 20 72 63 20 3d 20 4c 6f 63 6b 46 69  .    rc = LockFi
96a0: 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 46 69 6c  leEx(pFile->hFil
96b0: 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 30 2c  e.h, dwFlags, 0,
96c0: 20 6e 42 79 74 65 2c 20 30 2c 20 26 6f 76 6c 70   nByte, 0, &ovlp
96d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  );.  }.  if( !rc
96e0: 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
96f0: 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73  ("SHM-LOCK %d %s
9700: 20 45 52 52 4f 52 20 30 78 25 30 38 6c 78 5c 6e   ERROR 0x%08lx\n
9710: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
9720: 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
9730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  .             lo
9740: 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c  ckType==_SHM_UNL
9750: 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  CK ? "UnlockFile
9760: 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45  Ex" : "LockFileE
9770: 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
9780: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29   GetLastError())
9790: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 28 72  );.  }.  rc = (r
97a0: 63 21 3d 30 29 20 3f 20 53 51 4c 49 54 45 5f 4f  c!=0) ? SQLITE_O
97b0: 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
97c0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
97d0: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
97e0: 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
97f0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
9800: 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
9810: 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
9820: 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
9830: 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
9840: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
9850: 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
9860: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
9870: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
9880: 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
9890: 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
98a0: 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
98b0: 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
98c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
98d0: 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
98e0: 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
98f0: 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
9900: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
9910: 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
9920: 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
9930: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
9940: 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
9950: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
9960: 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
9970: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
9980: 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
9990: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
99a0: 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
99b0: 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d  ;.  pp = &winShm
99c0: 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  NodeList;.  whil
99d0: 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20  e( (p = *pp)!=0 
99e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  ){.    if( p->nR
99f0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
9a00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
9a10: 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
9a20: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
9a30: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66  >mutex);.      f
9a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
9a50: 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
9a60: 20 20 20 20 55 6e 6d 61 70 56 69 65 77 4f 66 46      UnmapViewOfF
9a70: 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  ile(p->aRegion[i
9a80: 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].pMap);.       
9a90: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e   CloseHandle(p->
9aa0: 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
9ab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ac0: 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20 21  if( p->hFile.h !
9ad0: 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
9ae0: 5f 56 41 4c 55 45 20 29 20 7b 0a 20 20 20 20 20  _VALUE ) {.     
9af0: 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
9b00: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
9b10: 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  hFile);.      }.
9b20: 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
9b30: 46 6c 61 67 20 29 20 77 69 6e 44 65 6c 65 74 65  Flag ) winDelete
9b40: 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e  (pVfs, p->zFilen
9b50: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 2a  ame, 0);.      *
9b60: 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
9b70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9b80: 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
9b90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9ba0: 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
9bb0: 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
9bc0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
9bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
9be0: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
9bf0: 72 65 61 2e 20 20 54 68 69 73 20 70 61 72 74 69  rea.  This parti
9c00: 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
9c10: 74 69 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61  tion uses.** mma
9c20: 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  pped files..**.*
9c30: 2a 20 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c  * zName is a fil
9c40: 65 6e 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64  ename used to id
9c50: 65 6e 74 69 66 79 20 74 68 65 20 73 68 61 72 65  entify the share
9c60: 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20  d-memory area.  
9c70: 54 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  The.** implement
9c80: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28  ation does not (
9c90: 61 6e 64 20 70 65 72 68 61 70 73 20 73 68 6f 75  and perhaps shou
9ca0: 6c 64 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73  ld not) use this
9cb0: 20 6e 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c   name.** directl
9cc0: 79 2c 20 62 75 74 20 72 61 74 68 65 72 20 75 73  y, but rather us
9cd0: 65 20 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61  e it as a templa
9ce0: 74 65 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61  te for finding a
9cf0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
9d00: 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68   name for the sh
9d10: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72  ared-memory stor
9d20: 61 67 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d  age.  In this im
9d30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68  plementation, th
9d40: 65 0a 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e  e.** string "-in
9d50: 64 65 78 22 20 69 73 20 61 70 70 65 6e 64 65 64  dex" is appended
9d60: 20 74 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73   to zName and us
9d70: 65 64 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f  ed as the name o
9d80: 66 20 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64  f the.** mmapped
9d90: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65   file..**.** Whe
9da0: 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
9db0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
9dc0: 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
9dd0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
9de0: 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
9df0: 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
9e00: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
9e10: 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
9e20: 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
9e30: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
9e40: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
9e50: 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
9e60: 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
9e70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
9e80: 20 77 69 6e 53 68 6d 4f 70 65 6e 28 0a 20 20 73   winShmOpen(.  s
9e90: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
9ea0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
9eb0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 74 74   to which to att
9ec0: 61 63 68 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ach shared memor
9ed0: 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  y */.){.  struct
9ee0: 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9f00: 44 61 74 61 62 61 73 65 20 74 6f 20 77 68 69 63  Database to whic
9f10: 68 20 74 6f 20 61 74 74 61 63 68 20 53 48 4d 20  h to attach SHM 
9f20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
9f30: 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
9f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9f50: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
9f60: 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
9f70: 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
9f80: 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ShmNode = 0;   /
9f90: 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
9fa0: 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
9fb0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9fe0: 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  code */.  struct
9ff0: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
a000: 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
a010: 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
a020: 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
a030: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e     /* Size of zN
a060: 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ame in bytes */.
a070: 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
a080: 69 6c 65 2a 29 66 64 3b 0a 20 20 61 73 73 65 72  ile*)fd;.  asser
a090: 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
a0a0: 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70  0 );    /* Not p
a0b0: 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
a0c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
a0d0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
a0e0: 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
a0f0: 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73   object.  Also s
a100: 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a  peculatively.  *
a110: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
a120: 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68   for a new winSh
a130: 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61  mNode and filena
a140: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  me..  */.  p = s
a150: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
a160: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
a170: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
a180: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a190: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
a1a0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 6e 4e 61  zeof(*p));.  nNa
a1b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
a1c0: 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74  en30(pDbFd->zPat
a1d0: 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  h);.  pNew = sql
a1e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
a1f0: 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
a200: 20 6e 4e 61 6d 65 20 2b 20 31 35 20 29 3b 0a 20   nName + 15 );. 
a210: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
a220: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a230: 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
a240: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
a250: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
a260: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
a270: 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c  ));.  pNew->zFil
a280: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
a290: 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74  pNew[1];.  sqlit
a2a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d  e3_snprintf(nNam
a2b0: 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  e+15, pNew->zFil
a2c0: 65 6e 61 6d 65 2c 20 22 25 73 2d 77 61 6c 2d 69  ename, "%s-wal-i
a2d0: 6e 64 65 78 22 2c 20 70 44 62 46 64 2d 3e 7a 50  ndex", pDbFd->zP
a2e0: 61 74 68 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ath);..  /* Look
a2f0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
a300: 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
a310: 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
a320: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
a330: 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
a340: 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
a350: 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
a360: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
a370: 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
a380: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
a390: 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
a3a0: 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
a3b0: 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
a3c0: 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
a3d0: 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
a3e0: 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
a3f0: 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
a400: 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
a410: 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
a420: 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
a430: 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
a440: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
a450: 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
a460: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
a470: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
a480: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
a490: 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
a4a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a4b0: 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
a4c0: 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
a4d0: 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
a4e0: 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
a4f0: 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
a500: 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
a510: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
a520: 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
a530: 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
a540: 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
a550: 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
a560: 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e  Node;..    pShmN
a570: 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
a580: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
a590: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
a5a0: 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
a5b0: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
a5c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
a5d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
a5e0: 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
a5f0: 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  err;.    }.    r
a600: 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46  c = winOpen(pDbF
a610: 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20  d->pVfs,.       
a620: 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
a630: 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  de->zFilename,  
a640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
a650: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
a660: 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20  UTF-8) */.      
a670: 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
a680: 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e  te3_file*)&pShmN
a690: 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20  ode->hFile,  /* 
a6a0: 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  File handle here
a6b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
a6c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
a6d0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
a6e0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
a6f0: 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a   /* Mode flags *
a700: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
a710: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53     0);.    if( S
a720: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
a730: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a740: 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
a750: 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
a760: 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
a770: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
a780: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
a790: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
a7a0: 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
a7b0: 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
a7c0: 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
a7d0: 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
a7e0: 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
a7f0: 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
a800: 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
a810: 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
a820: 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
a830: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a840: 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
a850: 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
a860: 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
a870: 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d  hFile, 0);.    }
a880: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
a890: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a8a0: 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
a8b0: 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
a8c0: 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
a8d0: 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63  MS, 1);.      rc
a8e0: 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
a8f0: 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
a900: 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_RDLCK, WIN_SH
a910: 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d  M_DMS, 1);.    }
a920: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
a930: 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
a940: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
a950: 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
a960: 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
a970: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
a980: 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
a990: 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 70 2d 3e 70  pShmNode;.  p->p
a9a0: 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
a9b0: 3e 70 46 69 72 73 74 3b 0a 23 69 66 64 65 66 20  >pFirst;.#ifdef 
a9c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
a9d0: 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
a9e0: 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
a9f0: 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
aa00: 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 70  >pFirst = p;.  p
aa10: 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
aa20: 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
aa30: 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76   p;.  winShmLeav
aa40: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
aa50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
aa60: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
aa70: 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
aa80: 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69  m_open_err:.  wi
aa90: 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
aaa0: 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
aab0: 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
aac0: 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
aad0: 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
aae0: 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
aaf0: 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
ab00: 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
ab10: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
ab20: 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
ab30: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
ab40: 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
ab50: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
ab60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ab70: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
ab80: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
ab90: 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
aba0: 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
abb0: 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
abc0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
abd0: 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 43 6c 6f  ic int winShmClo
abe0: 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  se(.  sqlite3_fi
abf0: 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
ac00: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
ac10: 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
ac20: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
ac30: 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
ac40: 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
ac50: 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
ac60: 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
ac70: 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
ac80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
ac90: 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
aca0: 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
acb0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
acc0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
acd0: 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
ace0: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
acf0: 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
ad00: 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
ad10: 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
ad20: 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
ad30: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
ad40: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
ad50: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
ad60: 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
ad70: 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
ad80: 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
ad90: 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
ada0: 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
adb0: 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
adc0: 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
add0: 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
ade0: 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
adf0: 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
ae00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ae10: 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
ae20: 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
ae30: 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
ae40: 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
ae50: 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
ae60: 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
ae70: 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
ae80: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
ae90: 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
aea0: 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
aeb0: 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
aec0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
aed0: 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
aee0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
aef0: 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
af00: 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
af10: 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
af20: 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
af30: 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
af40: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
af50: 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
af60: 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
af70: 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
af80: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
af90: 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
afa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
afb0: 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
afc0: 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
afd0: 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
afe0: 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
aff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b000: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b010: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
b020: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
b030: 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
b040: 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
b050: 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
b060: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
b070: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b080: 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
b090: 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
b0a0: 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
b0b0: 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
b0c0: 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
b0d0: 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
b0e0: 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
b0f0: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
b100: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
b110: 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
b120: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
b130: 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
b140: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
b150: 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
b160: 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
b170: 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
b180: 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
b190: 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
b1a0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
b1b0: 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
b1c0: 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
b1d0: 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
b1e0: 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
b1f0: 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
b200: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
b210: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
b220: 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73  urned. If .** is
b230: 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
b240: 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
b250: 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
b260: 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
b270: 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
b280: 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
b290: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
b2a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
b2b0: 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
b2c0: 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
b2d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
b2e0: 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
b2f0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
b300: 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
b310: 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
b320: 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
b330: 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
b340: 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
b350: 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
b360: 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
b370: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
b380: 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
b390: 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
b3a0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
b3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b3c0: 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
b3d0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
b3f0: 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
b400: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
b410: 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
b440: 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
b450: 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
b460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b470: 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
b480: 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
b4b0: 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
b4c0: 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
b4d0: 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4f0: 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
b500: 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
b510: 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
b520: 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
b530: 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
b540: 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  Shm;.  winShmNod
b550: 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
b560: 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
b570: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b580: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
b590: 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
b5a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
b5b0: 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
b5c0: 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
b5d0: 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
b5e0: 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69  egion==0 );..  i
b5f0: 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
b600: 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
b610: 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52  .    struct ShmR
b620: 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20  egion *apNew;   
b630: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
b640: 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
b650: 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
b660: 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
b670: 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
b680: 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
b690: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  e size */.    sq
b6a0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20  lite3_int64 sz; 
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
b6d0: 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69   of wal-index fi
b6e0: 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  le */..    pShmN
b6f0: 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
b700: 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f  szRegion;..    /
b710: 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
b720: 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
b730: 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
b740: 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
b750: 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43   space..    ** C
b760: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
b770: 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
b780: 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
b790: 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
b7a0: 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65   is.    ** large
b7b0: 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
b7c0: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
b7d0: 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f   region)..    */
b7e0: 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
b7f0: 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
b800: 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
b810: 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20  >hFile, &sz);.  
b820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b830: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
b840: 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
b850: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a     }..    if( sz
b860: 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
b870: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
b880: 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
b890: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
b8a0: 66 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74  f isWrite is set
b8b0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   to.      ** zer
b8c0: 6f 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  o, exit early. *
b8d0: 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
b8e0: 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
b8f0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
b900: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
b910: 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
b920: 69 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  if isWrite is no
b930: 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75  n-zero, use ftru
b940: 6e 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63  ncate() to alloc
b950: 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ate.      ** the
b960: 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
b970: 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20  y region..      
b980: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
b990: 57 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d  Write ) goto shm
b9a0: 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
b9b0: 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
b9c0: 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
b9d0: 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
b9e0: 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  e, nByte);.     
b9f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ba00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
ba10: 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
ba20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ba30: 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
ba40: 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
ba50: 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
ba60: 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
ba70: 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
ba80: 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20  apNew = (struct 
ba90: 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69  ShmRegion *)sqli
baa0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
bab0: 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
bac0: 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e  Region, (iRegion
bad0: 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77  +1)*sizeof(apNew
bae0: 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  [0]).    );.    
baf0: 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
bb00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
bb10: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
bb20: 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
bb30: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
bb40: 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
bb50: 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77   = apNew;..    w
bb60: 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
bb70: 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e  nRegion<=iRegion
bb80: 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45   ){.      HANDLE
bb90: 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
bba0: 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61        /* file-ma
bbb0: 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a  pping handle */.
bbc0: 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70        void *pMap
bbd0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
bbe0: 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f    /* Mapped memo
bbf0: 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20  ry region */.   
bc00: 20 20 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20    .      hMap = 
bc10: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
bc20: 67 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  g(pShmNode->hFil
bc30: 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e.h, .          
bc40: 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
bc50: 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
bc60: 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 20 20  NULL.      );.  
bc70: 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a      if( hMap ){.
bc80: 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 4d          pMap = M
bc90: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
bca0: 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
bcb0: 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
bcc0: 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
bcd0: 2c 20 30 2c 20 6e 42 79 74 65 0a 20 20 20 20 20  , 0, nByte.     
bce0: 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
bcf0: 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
bd00: 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
bd10: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47  e->lastErrno = G
bd20: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
bd30: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
bd40: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
bd50: 20 20 69 66 28 20 68 4d 61 70 20 29 20 43 6c 6f    if( hMap ) Clo
bd60: 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
bd70: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
bd80: 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
bd90: 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
bda0: 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
bdb0: 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
bdc0: 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
bdd0: 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
bde0: 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
bdf0: 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
be00: 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
be10: 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
be20: 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
be30: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
be40: 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
be50: 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61  egion ){.    cha
be60: 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70  r *p = (char *)p
be70: 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
be80: 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a  [iRegion].pMap;.
be90: 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20      *pp = (void 
bea0: 2a 29 26 70 5b 69 52 65 67 69 6f 6e 2a 73 7a 52  *)&p[iRegion*szR
beb0: 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
bec0: 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
bed0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
bee0: 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
bef0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
bf00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bf10: 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
bf20: 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
bf30: 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
bf40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
bf50: 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73   winShmLock(.  s
bf60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
bf70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
bf80: 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
bf90: 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
bfa0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
bfb0: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
bfc0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
bfd0: 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
bfe0: 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
bff0: 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
c000: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c010: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
c020: 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
c030: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
c060: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
c070: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
c080: 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
c090: 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
c0a0: 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
c0b0: 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
c0c0: 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
c0d0: 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
c0e0: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
c0f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  ;..  assert( ofs
c100: 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
c110: 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
c120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
c130: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
c140: 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
c150: 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
c160: 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
c170: 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
c180: 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
c190: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
c1a0: 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
c1b0: 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
c1c0: 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
c1d0: 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
c1e0: 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
c1f0: 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
c200: 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
c210: 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
c220: 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
c230: 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
c240: 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
c250: 3d 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  =0 );..  sqlite3
c260: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
c270: 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
c280: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
c290: 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
c2a0: 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68  {.    rc = winSh
c2b0: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
c2c0: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
c2d0: 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
c2e0: 41 53 45 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  ASE, n);.  }else
c2f0: 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
c300: 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
c310: 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68  {.    rc = winSh
c320: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
c330: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
c340: 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
c350: 41 53 45 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  ASE, n);.  }else
c360: 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68  {.    rc = winSh
c370: 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
c380: 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
c390: 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
c3a0: 41 53 45 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 73  ASE, n);.  }.  s
c3b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c3c0: 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
c3d0: 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
c3e0: 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
c3f0: 25 64 2c 20 70 69 64 2d 25 64 20 25 73 5c 6e 22  %d, pid-%d %s\n"
c400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
c410: 69 64 2c 20 28 69 6e 74 29 47 65 74 43 75 72 72  id, (int)GetCurr
c420: 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
c430: 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
c440: 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  "ok"));.  return
c450: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
c460: 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
c470: 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
c480: 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
c490: 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
c4a0: 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
c4b0: 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
c4c0: 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
c4d0: 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
c4e0: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
c4f0: 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
c500: 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
c510: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
c520: 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
c530: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
c540: 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
c550: 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
c560: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
c570: 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 4d  ory */.){.  /* M
c580: 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
c590: 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
c5a0: 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
c5b0: 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
c5c0: 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
c5d0: 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
c5e0: 74 65 78 28 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  tex();.}..#else.
c5f0: 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4f  # define winShmO
c600: 70 65 6e 20 20 20 20 30 0a 23 20 64 65 66 69 6e  pen    0.# defin
c610: 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20  e winShmMap     
c620: 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
c630: 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
c640: 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65  ine winShmBarrie
c650: 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  r 0.# define win
c660: 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a 23 65 6e  ShmClose   0.#en
c670: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
c680: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
c690: 2f 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*.***********
c6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6b0: 2a 2a 20 45 6e 64 20 53 68 61 72 65 64 20 4d 65  ** End Shared Me
c6c0: 6d 6f 72 79 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  mory ***********
c6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6e0: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
c6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
c740: 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
c750: 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
c760: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
c770: 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
c780: 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
c790: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
c7a0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
c7b0: 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
c7c0: 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c7e0: 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69  iVersion */.  wi
c7f0: 6e 43 6c 6f 73 65 2c 0a 20 20 77 69 6e 52 65 61  nClose,.  winRea
c800: 64 2c 0a 20 20 77 69 6e 57 72 69 74 65 2c 0a 20  d,.  winWrite,. 
c810: 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 0a 20 20   winTruncate,.  
c820: 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69 6e 46 69  winSync,.  winFi
c830: 6c 65 53 69 7a 65 2c 0a 20 20 77 69 6e 4c 6f 63  leSize,.  winLoc
c840: 6b 2c 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 0a  k,.  winUnlock,.
c850: 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
c860: 65 64 4c 6f 63 6b 2c 0a 20 20 77 69 6e 46 69 6c  edLock,.  winFil
c870: 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 77 69 6e 53  eControl,.  winS
c880: 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 77 69 6e  ectorSize,.  win
c890: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c8a0: 73 74 69 63 73 2c 0a 20 20 77 69 6e 53 68 6d 4f  stics,.  winShmO
c8b0: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
c8c0: 20 20 2f 2a 20 78 53 68 6d 4f 70 65 6e 20 2a 2f    /* xShmOpen */
c8d0: 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
c8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
c8f0: 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
c900: 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
c910: 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
c920: 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
c930: 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ier,           /
c940: 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
c950: 0a 20 20 77 69 6e 53 68 6d 43 6c 6f 73 65 20 20  .  winShmClose  
c960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
c970: 53 68 6d 43 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a  ShmClose */.};..
c980: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
c990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
c9d0: 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 49 2f  Here ends the I/
c9e0: 4f 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 66  O methods that f
c9f0: 6f 72 6d 20 74 68 65 20 73 71 6c 69 74 65 33 5f  orm the sqlite3_
ca00: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
ca10: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  t..**.** The nex
ca20: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
ca30: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 56  implements the V
ca40: 46 53 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 2a 2a  FS methods..****
ca50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca90: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
caa0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
cab0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
cac0: 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
cad0: 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
cae0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
caf0: 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
cb00: 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
cb10: 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
cb20: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
cb30: 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
cb40: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
cb50: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
cb60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
cb70: 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74   void *convertUt
cb80: 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
cb90: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
cba0: 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  ){.  void *zConv
cbb0: 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
cbc0: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a   isNT() ){.    z
cbd0: 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38  Converted = utf8
cbe0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
cbf0: 61 6d 65 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20  ame);./* isNT() 
cc00: 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f  is 1 if SQLITE_O
cc10: 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74  S_WINCE==1, so t
cc20: 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65  his else is neve
cc30: 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2f 0a  r executed. .*/.
cc40: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
cc50: 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
cc60: 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
cc70: 20 75 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c   utf8ToMbcs(zFil
cc80: 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
cc90: 20 7d 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77   }.  /* caller w
cca0: 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
ccb0: 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
ccc0: 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
ccd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
cce0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
ccf0: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
cd00: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
cd10: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
cd20: 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50  old at pVfs->mxP
cd30: 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65  athname characte
cd40: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
cd50: 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
cd60: 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
cd70: 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
cd80: 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
cd90: 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
cda0: 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
cdb0: 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
cdc0: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
cdd0: 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
cde0: 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b  ;.  size_t i, j;
cdf0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74  .  char zTempPat
ce00: 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20  h[MAX_PATH+1];. 
ce10: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d   if( sqlite3_tem
ce20: 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
ce30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
ce40: 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  ntf(MAX_PATH-30,
ce50: 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22   zTempPath, "%s"
ce60: 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
ce70: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 65 6c  irectory);.  }el
ce80: 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  se if( isNT() ){
ce90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
cea0: 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69  i;.    WCHAR zWi
ceb0: 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  dePath[MAX_PATH]
cec0: 3b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  ;.    GetTempPat
ced0: 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hW(MAX_PATH-30, 
cee0: 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
cef0: 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
cf00: 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
cf10: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
cf20: 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
cf30: 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
cf40: 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
cf50: 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69  th, "%s", zMulti
cf60: 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 4d  );.      free(zM
cf70: 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ulti);.    }else
cf80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
cf90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
cfa0: 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20   }./* isNT() is 
cfb0: 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  1 if SQLITE_OS_W
cfc0: 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73  INCE==1, so this
cfd0: 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65   else is never e
cfe0: 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e  xecuted. .** Sin
cff0: 63 65 20 74 68 65 20 41 53 43 49 49 20 76 65 72  ce the ASCII ver
d000: 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69  sion of these Wi
d010: 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74  ndows API do not
d020: 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45   exist for WINCE
d030: 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74  ,.** it's import
d040: 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72  ant to not refer
d050: 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49  ence them for WI
d060: 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23  NCE builds..*/.#
d070: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
d080: 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20  CE==0.  }else{. 
d090: 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
d0a0: 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
d0b0: 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
d0c0: 20 20 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d    GetTempPathA(M
d0d0: 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63  AX_PATH-30, zMbc
d0e0: 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66  sPath);.    zUtf
d0f0: 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  8 = sqlite3_win3
d100: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
d110: 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69  MbcsPath);.    i
d120: 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  f( zUtf8 ){.    
d130: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
d140: 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
d150: 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
d160: 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 66   zUtf8);.      f
d170: 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
d180: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
d190: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d1a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
d1b0: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
d1c0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
d1d0: 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54  Path); i>0 && zT
d1e0: 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c  empPath[i-1]=='\
d1f0: 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65  \'; i--){}.  zTe
d200: 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20  mpPath[i] = 0;. 
d210: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d220: 66 28 6e 42 75 66 2d 33 30 2c 20 7a 42 75 66 2c  f(nBuf-30, zBuf,
d230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d240: 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45      "%s\\"SQLITE
d250: 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
d260: 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20  X, zTempPath);. 
d270: 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   j = sqlite3Strl
d280: 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71  en30(zBuf);.  sq
d290: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
d2a0: 28 32 30 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (20, &zBuf[j]);.
d2b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 3b    for(i=0; i<20;
d2c0: 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
d2d0: 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
d2e0: 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
d2f0: 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
d300: 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
d310: 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  -1) ];.  }.  zBu
d320: 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 4f 53 54 52  f[j] = 0;.  OSTR
d330: 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e  ACE(("TEMP FILEN
d340: 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66  AME: %s\n", zBuf
d350: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
d360: 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  ITE_OK; .}../*.*
d370: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
d380: 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72  ue of getLastErr
d390: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
d3a0: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
d3b0: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
d3c0: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
d3d0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
d3e0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
d3f0: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
d400: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
d410: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
d420: 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
d430: 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72  *zBuf){.  /* For
d440: 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72  matMessage retur
d450: 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e  ns 0 on failure.
d460: 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20    Otherwise it. 
d470: 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20   ** returns the 
d480: 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73  number of TCHARs
d490: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
d4a0: 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66  output.  ** buff
d4b0: 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68  er, excluding th
d4c0: 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75  e terminating nu
d4d0: 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20  ll char..  */.  
d4e0: 44 57 4f 52 44 20 65 72 72 6f 72 20 3d 20 47 65  DWORD error = Ge
d4f0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
d500: 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b  DWORD dwLen = 0;
d510: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20  .  char *zOut = 
d520: 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  0;..  if( isNT()
d530: 20 29 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a   ){.    WCHAR *z
d540: 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b  TempWide = NULL;
d550: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 46 6f 72  .    dwLen = For
d560: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
d570: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
d580: 41 54 45 5f 42 55 46 46 45 52 20 7c 20 46 4f 52  ATE_BUFFER | FOR
d590: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
d5a0: 5f 53 59 53 54 45 4d 20 7c 20 46 4f 52 4d 41 54  _SYSTEM | FORMAT
d5b0: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
d5c0: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 65 72 72 6f 72 2c 0a 20 20 20 20       error,.    
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a       (LPWSTR) &z
d650: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
d6a0: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
d6b0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
d6c0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
d6d0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
d6e0: 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
d6f0: 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69  deToUtf8(zTempWi
d700: 64 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  de);.      /* fr
d710: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
d720: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
d730: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
d740: 2a 2f 0a 20 20 20 20 20 20 4c 6f 63 61 6c 46 72  */.      LocalFr
d750: 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  ee(zTempWide);. 
d760: 20 20 20 7d 0a 2f 2a 20 69 73 4e 54 28 29 20 69     }./* isNT() i
d770: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
d780: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
d790: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
d7a0: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
d7b0: 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
d7c0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
d7d0: 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
d7e0: 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
d7f0: 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
d800: 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
d810: 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
d820: 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
d830: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
d840: 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
d850: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
d860: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c   = NULL;.    dwL
d870: 65 6e 20 3d 20 46 6f 72 6d 61 74 4d 65 73 73 61  en = FormatMessa
d880: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
d890: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
d8a0: 45 52 20 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53  ER | FORMAT_MESS
d8b0: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
d8c0: 7c 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  | FORMAT_MESSAGE
d8d0: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
d8e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
d900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72               err
d920: 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d940: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50               (LP
d960: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &zTemp,.   
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d980: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
d9b0: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
d9c0: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
d9d0: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
d9e0: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
d9f0: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  .      zOut = sq
da00: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
da10: 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
da20: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
da30: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
da40: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
da50: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
da60: 20 20 20 20 20 4c 6f 63 61 6c 46 72 65 65 28 7a       LocalFree(z
da70: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Temp);.    }.#en
da80: 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 30 20  dif.  }.  if( 0 
da90: 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20  == dwLen ){.    
daa0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
dab0: 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73  (nBuf, zBuf, "Os
dac0: 45 72 72 6f 72 20 30 78 25 78 20 28 25 75 29 22  Error 0x%x (%u)"
dad0: 2c 20 65 72 72 6f 72 2c 20 65 72 72 6f 72 29 3b  , error, error);
dae0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
daf0: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
db00: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
db10: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
db20: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
db30: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
db40: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
db50: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
db60: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
db70: 20 20 20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20     free(zOut);. 
db80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
db90: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
dba0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
dbb0: 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
dbc0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
dbd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
dbe0: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
dbf0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
dc00: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
dc10: 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
dc20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
dc30: 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a   *id,         /*
dc40: 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74   Write the SQLit
dc50: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  e file handle he
dc60: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
dc70: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
dc80: 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66    /* Open mode f
dc90: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  lags */.  int *p
dca0: 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20  OutFlags        
dcb0: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65      /* Status re
dcc0: 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  turn flags */.){
dcd0: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44  .  HANDLE h;.  D
dce0: 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
dcf0: 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77  cess;.  DWORD dw
dd00: 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f  ShareMode;.  DWO
dd10: 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73  RD dwCreationDis
dd20: 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52  position;.  DWOR
dd30: 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  D dwFlagsAndAttr
dd40: 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20  ibutes = 0;.#if 
dd50: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
dd60: 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30    int isTemp = 0
dd70: 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  ;.#endif.  winFi
dd80: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
dd90: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
dda0: 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddc0: 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
ddd0: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
dde0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
ddf0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 20 20 20  ame = zName;    
de00: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
de10: 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
de20: 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65  .  char zTmpname
de30: 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 20 20  [MAX_PATH+1];   
de40: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
de50: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65  sed to create te
de60: 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a  mp filename */..
de70: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
de80: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
de90: 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
dea0: 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c  pFile->h = INVAL
deb0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
dec0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65  ..  /* If the se
ded0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
dee0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
def0: 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65  s NULL, generate
df00: 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61   a .  ** tempora
df10: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20  ry file name to 
df20: 75 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  use .  */.  if( 
df30: 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20  !zUtf8Name ){.  
df40: 20 20 69 6e 74 20 72 63 20 3d 20 67 65 74 54 65    int rc = getTe
df50: 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b  mpname(MAX_PATH+
df60: 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  1, zTmpname);.  
df70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
df80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
df90: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
dfa0: 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
dfb0: 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
dfc0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69  * Convert the fi
dfd0: 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79  lename to the sy
dfe0: 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a  stem encoding. *
dff0: 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  /.  zConverted =
e000: 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
e010: 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b  name(zUtf8Name);
e020: 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
e030: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
e040: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e050: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67  .  }..  if( flag
e060: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
e070: 52 45 41 44 57 52 49 54 45 20 29 7b 0a 20 20 20  READWRITE ){.   
e080: 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
e090: 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
e0a0: 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
e0b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
e0c0: 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
e0d0: 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
e0e0: 7d 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  }.  /* SQLITE_OP
e0f0: 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
e100: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
e110: 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
e120: 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74  e is .  ** creat
e130: 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
e140: 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
e150: 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
e160: 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61   access" .  ** a
e170: 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
e180: 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
e190: 0a 20 20 61 73 73 65 72 74 28 21 28 66 6c 61 67  .  assert(!(flag
e1a0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
e1b0: 45 58 43 4c 55 53 49 56 45 29 20 7c 7c 20 28 66  EXCLUSIVE) || (f
e1c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e1d0: 45 4e 5f 43 52 45 41 54 45 29 29 3b 0a 20 20 69  EN_CREATE));.  i
e1e0: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
e1f0: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
e200: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   ){.    /* Creat
e210: 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f  es a new file, o
e220: 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e  nly if it does n
e230: 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
e240: 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74  . */.    /* If t
e250: 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  he file exists, 
e260: 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20  it fails. */.   
e270: 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
e280: 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f  sition = CREATE_
e290: 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NEW;.  }else if(
e2a0: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
e2b0: 4f 50 45 4e 5f 43 52 45 41 54 45 20 29 7b 0a 20  OPEN_CREATE ){. 
e2c0: 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
e2d0: 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
e2e0: 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
e2f0: 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
e300: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
e310: 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
e320: 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
e330: 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
e340: 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
e350: 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
e360: 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
e370: 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
e380: 47 3b 0a 20 20 7d 0a 20 20 64 77 53 68 61 72 65  G;.  }.  dwShare
e390: 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
e3a0: 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
e3b0: 41 52 45 5f 57 52 49 54 45 3b 0a 20 20 69 66 28  ARE_WRITE;.  if(
e3c0: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
e3d0: 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
e3e0: 53 45 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  SE ){.#if SQLITE
e3f0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
e400: 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
e410: 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
e420: 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
e430: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
e440: 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
e450: 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
e460: 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
e470: 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
e4a0: 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
e4d0: 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
e4e0: 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
e4f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
e500: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
e510: 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
e520: 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
e530: 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
e540: 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
e550: 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
e560: 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
e570: 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
e580: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
e590: 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
e5a0: 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
e5b0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
e5c0: 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
e5d0: 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
e5e0: 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
e5f0: 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 20 20 69  CESS;.#endif.  i
e600: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
e610: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 57   h = CreateFileW
e620: 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65 72  ((WCHAR*)zConver
e630: 74 65 64 2c 0a 20 20 20 20 20 20 20 64 77 44 65  ted,.       dwDe
e640: 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
e650: 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
e660: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
e670: 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
e680: 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
e690: 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
e6a0: 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
e6b0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 2f 2a 20 69  NULL.    );./* i
e6c0: 73 4e 54 28 29 20 69 73 20 31 20 69 66 20 53 51  sNT() is 1 if SQ
e6d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31  LITE_OS_WINCE==1
e6e0: 2c 20 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69  , so this else i
e6f0: 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 64  s never executed
e700: 2e 20 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  . .** Since the 
e710: 41 53 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66  ASCII version of
e720: 20 74 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41   these Windows A
e730: 50 49 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  PI do not exist 
e740: 66 6f 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74  for WINCE,.** it
e750: 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  's important to 
e760: 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 74 68  not reference th
e770: 65 6d 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69  em for WINCE bui
e780: 6c 64 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lds..*/.#if SQLI
e790: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20  TE_OS_WINCE==0. 
e7a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20   }else{.    h = 
e7b0: 43 72 65 61 74 65 46 69 6c 65 41 28 28 63 68 61  CreateFileA((cha
e7c0: 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  r*)zConverted,. 
e7d0: 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
e7e0: 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 64 77  ccess,.       dw
e7f0: 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
e800: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 64    NULL,.       d
e810: 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
e820: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 64 77 46  tion,.       dwF
e830: 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
e840: 73 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  s,.       NULL. 
e850: 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d     );.#endif.  }
e860: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
e870: 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73  N %d %s 0x%lx %s
e880: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
e890: 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73   h, zName, dwDes
e8a0: 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20  iredAccess, .   
e8b0: 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c          h==INVAL
e8c0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
e8d0: 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
e8e0: 22 29 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e  "));.  if( h==IN
e8f0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
e900: 55 45 20 29 7b 0a 20 20 20 20 66 72 65 65 28 7a  UE ){.    free(z
e910: 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
e920: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
e930: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
e940: 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
e950: 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
e960: 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20  zName, id, .    
e970: 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
e980: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
e990: 44 4f 4e 4c 59 29 26 7e 53 51 4c 49 54 45 5f 4f  DONLY)&~SQLITE_O
e9a0: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 2c 20  PEN_READWRITE), 
e9b0: 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
e9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
e9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
e9e0: 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
e9f0: 20 20 7d 0a 20 20 69 66 28 20 70 4f 75 74 46 6c    }.  if( pOutFl
ea00: 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 66  ags ){.    if( f
ea10: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
ea20: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 29 7b 0a  EN_READWRITE ){.
ea30: 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
ea40: 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
ea50: 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
ea60: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
ea70: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
ea80: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
ea90: 20 20 7d 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74    }.  }.  memset
eaa0: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
eab0: 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20 70 46  f(*pFile));.  pF
eac0: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
ead0: 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70  winIoMethod;.  p
eae0: 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  File->h = h;.  p
eaf0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
eb00: 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
eb10: 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
eb20: 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20  ;.  pFile->pShm 
eb30: 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50  = 0;.  pFile->zP
eb40: 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ath = zName;.  p
eb50: 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
eb60: 20 3d 20 67 65 74 53 65 63 74 6f 72 53 69 7a 65   = getSectorSize
eb70: 28 70 56 66 73 2c 20 7a 55 74 66 38 4e 61 6d 65  (pVfs, zUtf8Name
eb80: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
eb90: 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 28 66 6c  _WINCE.  if( (fl
eba0: 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
ebb0: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
ebc0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
ebd0: 29 29 20 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  )) ==.          
ebe0: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
ebf0: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
ec00: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
ec10: 0a 20 20 20 20 20 20 20 26 26 20 21 77 69 6e 63  .       && !winc
ec20: 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
ec30: 65 2c 20 70 46 69 6c 65 29 0a 20 20 29 7b 0a 20  e, pFile).  ){. 
ec40: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68     CloseHandle(h
ec50: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e  );.    free(zCon
ec60: 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74  verted);.    ret
ec70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
ec80: 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  PEN_BKPT;.  }.  
ec90: 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
eca0: 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
ecb0: 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
ecc0: 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
ecd0: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 66 72 65  ndif.  {.    fre
ece0: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
ecf0: 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
ed00: 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (+1);.  return S
ed10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ed20: 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
ed30: 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
ed40: 4e 6f 74 65 20 74 68 61 74 20 77 69 6e 64 6f 77  Note that window
ed50: 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
ed60: 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
ed70: 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
ed80: 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
ed90: 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
eda0: 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
edb0: 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
edc0: 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
edd0: 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
ede0: 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
edf0: 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
ee00: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
ee10: 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
ee20: 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
ee30: 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
ee40: 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
ee50: 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
ee60: 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
ee70: 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
ee80: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
ee90: 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
eea0: 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
eeb0: 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
eec0: 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
eed0: 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
eee0: 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
eef0: 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
ef00: 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
ef10: 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
ef20: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
ef30: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  error..*/.#defin
ef40: 65 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  e MX_DELETION_AT
ef50: 54 45 4d 50 54 53 20 35 0a 73 74 61 74 69 63 20  TEMPTS 5.static 
ef60: 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
ef70: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
ef80: 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
ef90: 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
efa0: 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
efb0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
efc0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
efd0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
efe0: 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f000: 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
f010: 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
f020: 6e 74 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  nt = 0;.  DWORD 
f030: 72 63 3b 0a 20 20 44 57 4f 52 44 20 65 72 72 6f  rc;.  DWORD erro
f040: 72 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  r = 0;.  void *z
f050: 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
f060: 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
f070: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
f080: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
f090: 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Vfs);.  UNUSED_P
f0a0: 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72  ARAMETER(syncDir
f0b0: 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
f0c0: 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
f0d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f0e0: 4d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  M;.  }.  Simulat
f0f0: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
f100: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
f110: 45 54 45 29 3b 0a 20 20 69 66 28 20 69 73 4e 54  ETE);.  if( isNT
f120: 28 29 20 29 7b 0a 20 20 20 20 64 6f 7b 0a 20 20  () ){.    do{.  
f130: 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57 28      DeleteFileW(
f140: 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
f150: 20 7d 77 68 69 6c 65 28 20 20 20 28 20 20 20 28   }while(   (   (
f160: 28 72 63 20 3d 20 47 65 74 46 69 6c 65 41 74 74  (rc = GetFileAtt
f170: 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72  ributesW(zConver
f180: 74 65 64 29 29 20 21 3d 20 49 4e 56 41 4c 49 44  ted)) != INVALID
f190: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
f1a0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
f1b0: 20 7c 7c 20 28 28 65 72 72 6f 72 20 3d 20 47 65   || ((error = Ge
f1c0: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 20 3d 3d  tLastError()) ==
f1d0: 20 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45   ERROR_ACCESS_DE
f1e0: 4e 49 45 44 29 29 0a 20 20 20 20 20 20 20 20 20  NIED)).         
f1f0: 20 20 26 26 20 28 2b 2b 63 6e 74 20 3c 20 4d 58    && (++cnt < MX
f200: 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
f210: 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 26  TS).           &
f220: 26 20 28 53 6c 65 65 70 28 31 30 30 29 2c 20 31  & (Sleep(100), 1
f230: 29 20 29 3b 0a 2f 2a 20 69 73 4e 54 28 29 20 69  ) );./* isNT() i
f240: 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 4f 53  s 1 if SQLITE_OS
f250: 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20 74 68  _WINCE==1, so th
f260: 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76 65 72  is else is never
f270: 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a 20 53   executed. .** S
f280: 69 6e 63 65 20 74 68 65 20 41 53 43 49 49 20 76  ince the ASCII v
f290: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73 65 20  ersion of these 
f2a0: 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f 20 6e  Windows API do n
f2b0: 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57 49 4e  ot exist for WIN
f2c0: 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d 70 6f  CE,.** it's impo
f2d0: 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72 65 66  rtant to not ref
f2e0: 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f 72 20  erence them for 
f2f0: 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a 2a 2f  WINCE builds..*/
f300: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
f310: 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
f320: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 44  .    do{.      D
f330: 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
f340: 65 72 74 65 64 29 3b 0a 20 20 20 20 7d 77 68 69  erted);.    }whi
f350: 6c 65 28 20 20 20 28 20 20 20 28 28 72 63 20 3d  le(   (   ((rc =
f360: 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74   GetFileAttribut
f370: 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 29  esA(zConverted))
f380: 20 21 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   != INVALID_FILE
f390: 5f 41 54 54 52 49 42 55 54 45 53 29 0a 20 20 20  _ATTRIBUTES).   
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
f3b0: 28 65 72 72 6f 72 20 3d 20 47 65 74 4c 61 73 74  (error = GetLast
f3c0: 45 72 72 6f 72 28 29 29 20 3d 3d 20 45 52 52 4f  Error()) == ERRO
f3d0: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29  R_ACCESS_DENIED)
f3e0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
f3f0: 28 2b 2b 63 6e 74 20 3c 20 4d 58 5f 44 45 4c 45  (++cnt < MX_DELE
f400: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 29 0a 20  TION_ATTEMPTS). 
f410: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 53 6c            && (Sl
f420: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
f430: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
f440: 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
f450: 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
f460: 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20  E \"%s\" %s\n", 
f470: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
f480: 20 20 28 20 28 72 63 3d 3d 49 4e 56 41 4c 49 44    ( (rc==INVALID
f490: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
f4a0: 29 20 26 26 20 28 65 72 72 6f 72 3d 3d 45 52 52  ) && (error==ERR
f4b0: 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
f4c0: 44 29 29 20 3f 0a 20 20 20 20 20 20 20 20 20 22  D)) ?.         "
f4d0: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 20 29  ok" : "failed" )
f4e0: 29 3b 0a 20 0a 20 20 72 65 74 75 72 6e 20 28 20  );. .  return ( 
f4f0: 20 20 28 72 63 20 3d 3d 20 49 4e 56 41 4c 49 44    (rc == INVALID
f500: 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
f510: 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
f520: 28 65 72 72 6f 72 20 3d 3d 20 45 52 52 4f 52 5f  (error == ERROR_
f530: 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 29 29  FILE_NOT_FOUND))
f540: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
f550: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
f560: 54 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  TE;.}../*.** Che
f570: 63 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  ck the existance
f580: 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
f590: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
f5a0: 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
f5b0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
f5c0: 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
f5d0: 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
f5e0: 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
f5f0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
f600: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
f610: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
f620: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
f630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
f640: 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
f650: 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
f660: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
f670: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
f680: 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
f690: 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
f6a0: 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
f6b0: 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
f6c0: 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
f6d0: 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
f6e0: 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
f6f0: 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
f700: 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
f710: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
f720: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
f730: 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
f740: 20 29 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47   ){.    attr = G
f750: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
f760: 57 28 28 57 43 48 41 52 2a 29 7a 43 6f 6e 76 65  W((WCHAR*)zConve
f770: 72 74 65 64 29 3b 0a 2f 2a 20 69 73 4e 54 28 29  rted);./* isNT()
f780: 20 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f   is 1 if SQLITE_
f790: 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20 73 6f 20  OS_WINCE==1, so 
f7a0: 74 68 69 73 20 65 6c 73 65 20 69 73 20 6e 65 76  this else is nev
f7b0: 65 72 20 65 78 65 63 75 74 65 64 2e 20 0a 2a 2a  er executed. .**
f7c0: 20 53 69 6e 63 65 20 74 68 65 20 41 53 43 49 49   Since the ASCII
f7d0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 73   version of thes
f7e0: 65 20 57 69 6e 64 6f 77 73 20 41 50 49 20 64 6f  e Windows API do
f7f0: 20 6e 6f 74 20 65 78 69 73 74 20 66 6f 72 20 57   not exist for W
f800: 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73 20 69 6d  INCE,.** it's im
f810: 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 20 72  portant to not r
f820: 65 66 65 72 65 6e 63 65 20 74 68 65 6d 20 66 6f  eference them fo
f830: 72 20 57 49 4e 43 45 20 62 75 69 6c 64 73 2e 0a  r WINCE builds..
f840: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
f850: 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
f860: 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 47 65  e{.    attr = Ge
f870: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
f880: 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
f890: 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
f8a0: 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65    free(zConverte
f8b0: 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
f8c0: 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
f8d0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
f8e0: 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
f8f0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
f900: 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
f910: 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
f920: 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
f930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f940: 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
f950: 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
f960: 20 20 72 63 20 3d 20 28 61 74 74 72 20 26 20 46    rc = (attr & F
f970: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
f980: 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
f990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
f9a0: 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
f9b0: 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
f9c0: 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
f9d0: 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
f9e0: 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rc;.  return SQL
f9f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
fa00: 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
fa10: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
fa20: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
fa30: 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
fa40: 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
fa50: 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
fa60: 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
fa70: 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
fa80: 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
fa90: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
faa0: 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
fab0: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
fac0: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
fad0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
fae0: 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
faf0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fb00: 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
fb10: 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
fb20: 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
fb30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
fb60: 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
fb70: 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
fb80: 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
fb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
fba0: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
fbb0: 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
fbc0: 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 55 4e 55  _CYGWIN__).  UNU
fbd0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
fbe0: 75 6c 6c 29 3b 0a 20 20 63 79 67 77 69 6e 5f 63  ull);.  cygwin_c
fbf0: 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33  onv_to_full_win3
fc00: 32 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65  2_path(zRelative
fc10: 2c 20 7a 46 75 6c 6c 29 3b 0a 20 20 72 65 74 75  , zFull);.  retu
fc20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
fc30: 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
fc40: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 55 4e 55 53  _OS_WINCE.  UNUS
fc50: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75  ED_PARAMETER(nFu
fc60: 6c 6c 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  ll);.  /* WinCE 
fc70: 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
fc80: 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
fc90: 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
fca0: 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 73 71 6c  m told. */.  sql
fcb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56  ite3_snprintf(pV
fcc0: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
fcd0: 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
fce0: 6c 61 74 69 76 65 29 3b 0a 20 20 72 65 74 75 72  lative);.  retur
fcf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
fd00: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
fd10: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
fd20: 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
fd30: 29 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ).  int nByte;. 
fd40: 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
fd50: 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
fd60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
fd70: 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 7a 43  TER(nFull);.  zC
fd80: 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65  onverted = conve
fd90: 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  rtUtf8Filename(z
fda0: 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28  Relative);.  if(
fdb0: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 57   isNT() ){.    W
fdc0: 43 48 41 52 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  CHAR *zTemp;.   
fdd0: 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c   nByte = GetFull
fde0: 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48 41 52  PathNameW((WCHAR
fdf0: 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
fe00: 20 30 2c 20 30 29 20 2b 20 33 3b 0a 20 20 20 20   0, 0) + 3;.    
fe10: 7a 54 65 6d 70 20 3d 20 6d 61 6c 6c 6f 63 28 20  zTemp = malloc( 
fe20: 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
fe30: 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
fe40: 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
fe50: 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72      free(zConver
fe60: 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
fe70: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
fe80: 0a 20 20 20 20 7d 0a 20 20 20 20 47 65 74 46 75  .    }.    GetFu
fe90: 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 57 43 48  llPathNameW((WCH
fea0: 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  AR*)zConverted, 
feb0: 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
fec0: 3b 0a 20 20 20 20 66 72 65 65 28 7a 43 6f 6e 76  ;.    free(zConv
fed0: 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
fee0: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
fef0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 66 72 65  (zTemp);.    fre
ff00: 65 28 7a 54 65 6d 70 29 3b 0a 2f 2a 20 69 73 4e  e(zTemp);./* isN
ff10: 54 28 29 20 69 73 20 31 20 69 66 20 53 51 4c 49  T() is 1 if SQLI
ff20: 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 31 2c 20  TE_OS_WINCE==1, 
ff30: 73 6f 20 74 68 69 73 20 65 6c 73 65 20 69 73 20  so this else is 
ff40: 6e 65 76 65 72 20 65 78 65 63 75 74 65 64 2e 20  never executed. 
ff50: 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 41 53  .** Since the AS
ff60: 43 49 49 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  CII version of t
ff70: 68 65 73 65 20 57 69 6e 64 6f 77 73 20 41 50 49  hese Windows API
ff80: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 66 6f   do not exist fo
ff90: 72 20 57 49 4e 43 45 2c 0a 2a 2a 20 69 74 27 73  r WINCE,.** it's
ffa0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f   important to no
ffb0: 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 6d  t reference them
ffc0: 20 66 6f 72 20 57 49 4e 43 45 20 62 75 69 6c 64   for WINCE build
ffd0: 73 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  s..*/.#if SQLITE
ffe0: 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
fff0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
10000 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65  zTemp;.    nByte
10010 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   = GetFullPathNa
10020 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
10030 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 20  erted, 0, 0, 0) 
10040 2b 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  + 3;.    zTemp =
10050 20 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 2a 73   malloc( nByte*s
10060 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
10070 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
10080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
10090 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
100a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
100b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
100c0 20 20 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e      GetFullPathN
100d0 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
100e0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
100f0 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 66 72  Temp, 0);.    fr
10100 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
10110 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
10120 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
10130 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
10140 20 20 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 23    free(zTemp);.#
10150 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20  endif.  }.  if( 
10160 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
10170 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 70 56 66  te3_snprintf(pVf
10180 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
10190 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74  Full, "%s", zOut
101a0 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 4f 75 74  );.    free(zOut
101b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
101c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
101d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
101e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
101f0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  endif.}../*.** G
10200 65 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  et the sector si
10210 7a 65 20 6f 66 20 74 68 65 20 64 65 76 69 63 65  ze of the device
10220 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a   used to store.*
10230 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
10240 63 20 69 6e 74 20 67 65 74 53 65 63 74 6f 72 53  c int getSectorS
10250 69 7a 65 28 0a 20 20 20 20 73 71 6c 69 74 65 33  ize(.    sqlite3
10260 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 20 20  _vfs *pVfs,.    
10270 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
10280 61 74 69 76 65 20 20 20 20 20 2f 2a 20 55 54 46  ative     /* UTF
10290 2d 38 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  -8 file name */.
102a0 29 7b 0a 20 20 44 57 4f 52 44 20 62 79 74 65 73  ){.  DWORD bytes
102b0 50 65 72 53 65 63 74 6f 72 20 3d 20 53 51 4c 49  PerSector = SQLI
102c0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
102d0 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 47 65 74  R_SIZE;.  /* Get
102e0 44 69 73 6b 46 72 65 65 53 70 61 63 65 20 69 73  DiskFreeSpace is
102f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 75   not supported u
10300 6e 64 65 72 20 57 49 4e 43 45 20 2a 2f 0a 23 69  nder WINCE */.#i
10310 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10320 45 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  E.  UNUSED_PARAM
10330 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
10340 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
10350 52 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 65  Relative);.#else
10360 0a 20 20 63 68 61 72 20 7a 46 75 6c 6c 70 61 74  .  char zFullpat
10370 68 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20  h[MAX_PATH+1];. 
10380 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44   int rc;.  DWORD
10390 20 64 77 52 65 74 20 3d 20 30 3b 0a 20 20 44 57   dwRet = 0;.  DW
103a0 4f 52 44 20 64 77 44 75 6d 6d 79 3b 0a 0a 20 20  ORD dwDummy;..  
103b0 2f 2a 0a 20 20 2a 2a 20 57 65 20 6e 65 65 64 20  /*.  ** We need 
103c0 74 6f 20 67 65 74 20 74 68 65 20 66 75 6c 6c 20  to get the full 
103d0 70 61 74 68 20 6e 61 6d 65 20 6f 66 20 74 68 65  path name of the
103e0 20 66 69 6c 65 0a 20 20 2a 2a 20 74 6f 20 67 65   file.  ** to ge
103f0 74 20 74 68 65 20 64 72 69 76 65 20 6c 65 74 74  t the drive lett
10400 65 72 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74 68  er to look up th
10410 65 20 73 65 63 74 6f 72 0a 20 20 2a 2a 20 73 69  e sector.  ** si
10420 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
10430 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  winFullPathname(
10440 70 56 66 73 2c 20 7a 52 65 6c 61 74 69 76 65 2c  pVfs, zRelative,
10450 20 4d 41 58 5f 50 41 54 48 2c 20 7a 46 75 6c 6c   MAX_PATH, zFull
10460 70 61 74 68 29 3b 0a 20 20 69 66 28 20 72 63 20  path);.  if( rc 
10470 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 20  == SQLITE_OK ). 
10480 20 7b 0a 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f   {.    void *zCo
10490 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
104a0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
104b0 75 6c 6c 70 61 74 68 29 3b 0a 20 20 20 20 69 66  ullpath);.    if
104c0 28 20 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a  ( zConverted ){.
104d0 20 20 20 20 20 20 69 66 28 20 69 73 4e 54 28 29        if( isNT()
104e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74   ){.        /* t
104f0 72 69 6d 20 70 61 74 68 20 74 6f 20 6a 75 73 74  rim path to just
10500 20 64 72 69 76 65 20 72 65 66 65 72 65 6e 63 65   drive reference
10510 20 2a 2f 0a 20 20 20 20 20 20 20 20 57 43 48 41   */.        WCHA
10520 52 20 2a 70 20 3d 20 7a 43 6f 6e 76 65 72 74 65  R *p = zConverte
10530 64 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  d;.        for(;
10540 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  *p;p++){.       
10550 20 20 20 69 66 28 20 2a 70 20 3d 3d 20 27 5c 5c     if( *p == '\\
10560 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
10570 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20   *p = '\0';.    
10580 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
105a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 77 52     }.        dwR
105b0 65 74 20 3d 20 47 65 74 44 69 73 6b 46 72 65 65  et = GetDiskFree
105c0 53 70 61 63 65 57 28 28 57 43 48 41 52 2a 29 7a  SpaceW((WCHAR*)z
105d0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77               &dw
10600 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20  Dummy,.         
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10620 20 20 20 20 20 20 20 20 20 26 62 79 74 65 73 50           &bytesP
10630 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20 20 20  erSector,.      
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 20 20 20 20 20 20 20 20 26 64 77 44              &dwD
10660 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20 20 20  ummy,.          
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 20 20 26 64 77 44 75 6d 6d 79          &dwDummy
10690 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
106a0 20 20 20 20 20 20 20 20 2f 2a 20 74 72 69 6d 20          /* trim 
106b0 70 61 74 68 20 74 6f 20 6a 75 73 74 20 64 72 69  path to just dri
106c0 76 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  ve reference */.
106d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 20          char *p 
106e0 3d 20 28 63 68 61 72 20 2a 29 7a 43 6f 6e 76 65  = (char *)zConve
106f0 72 74 65 64 3b 0a 20 20 20 20 20 20 20 20 66 6f  rted;.        fo
10700 72 28 3b 2a 70 3b 70 2b 2b 29 7b 0a 20 20 20 20  r(;*p;p++){.    
10710 20 20 20 20 20 20 69 66 28 20 2a 70 20 3d 3d 20        if( *p == 
10720 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
10730 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b 0a 20      *p = '\0';. 
10740 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
10750 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10770 64 77 52 65 74 20 3d 20 47 65 74 44 69 73 6b 46  dwRet = GetDiskF
10780 72 65 65 53 70 61 63 65 41 28 28 63 68 61 72 2a  reeSpaceA((char*
10790 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
107c0 64 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20  dwDummy,.       
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 20 20 20 20 20 20 20 20 20 20 26 62 79 74 65             &byte
107f0 73 50 65 72 53 65 63 74 6f 72 2c 0a 20 20 20 20  sPerSector,.    
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
10820 77 44 75 6d 6d 79 2c 0a 20 20 20 20 20 20 20 20  wDummy,.        
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 20 20 20 20 20 20 20 20 26 64 77 44 75 6d            &dwDum
10850 6d 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  my);.      }.   
10860 20 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74     free(zConvert
10870 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ed);.    }.    i
10880 66 28 20 21 64 77 52 65 74 20 29 7b 0a 20 20 20  f( !dwRet ){.   
10890 20 20 20 62 79 74 65 73 50 65 72 53 65 63 74 6f     bytesPerSecto
108a0 72 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  r = SQLITE_DEFAU
108b0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
108c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
108d0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20  .  return (int) 
108e0 62 79 74 65 73 50 65 72 53 65 63 74 6f 72 3b 20  bytesPerSector; 
108f0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
10900 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
10910 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
10920 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
10930 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
10940 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
10950 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
10960 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
10970 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
10980 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
10990 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  library..*/./*.*
109a0 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
109b0 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
109c0 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
109d0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
109e0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
109f0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
10a00 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
10a10 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
10a20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
10a30 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  nDlOpen(sqlite3_
10a40 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
10a50 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
10a60 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
10a70 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
10a80 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
10a90 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
10aa0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
10ab0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
10ac0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
10ad0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
10ae0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  0;.  }.  if( isN
10af0 54 28 29 20 29 7b 0a 20 20 20 20 68 20 3d 20 4c  T() ){.    h = L
10b00 6f 61 64 4c 69 62 72 61 72 79 57 28 28 57 43 48  oadLibraryW((WCH
10b10 41 52 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  AR*)zConverted);
10b20 0a 2f 2a 20 69 73 4e 54 28 29 20 69 73 20 31 20  ./* isNT() is 1 
10b30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
10b40 43 45 3d 3d 31 2c 20 73 6f 20 74 68 69 73 20 65  CE==1, so this e
10b50 6c 73 65 20 69 73 20 6e 65 76 65 72 20 65 78 65  lse is never exe
10b60 63 75 74 65 64 2e 20 0a 2a 2a 20 53 69 6e 63 65  cuted. .** Since
10b70 20 74 68 65 20 41 53 43 49 49 20 76 65 72 73 69   the ASCII versi
10b80 6f 6e 20 6f 66 20 74 68 65 73 65 20 57 69 6e 64  on of these Wind
10b90 6f 77 73 20 41 50 49 20 64 6f 20 6e 6f 74 20 65  ows API do not e
10ba0 78 69 73 74 20 66 6f 72 20 57 49 4e 43 45 2c 0a  xist for WINCE,.
10bb0 2a 2a 20 69 74 27 73 20 69 6d 70 6f 72 74 61 6e  ** it's importan
10bc0 74 20 74 6f 20 6e 6f 74 20 72 65 66 65 72 65 6e  t to not referen
10bd0 63 65 20 74 68 65 6d 20 66 6f 72 20 57 49 4e 43  ce them for WINC
10be0 45 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66  E builds..*/.#if
10bf0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10c00 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
10c10 20 68 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79   h = LoadLibrary
10c20 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
10c30 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
10c40 0a 20 20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  .  free(zConvert
10c50 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  ed);.  return (v
10c60 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63  oid*)h;.}.static
10c70 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72   void winDlError
10c80 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
10c90 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
10ca0 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
10cb0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10cc0 28 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73  (pVfs);.  getLas
10cd0 74 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20  tErrorMsg(nBuf, 
10ce0 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 76 6f 69 64  zBufOut);.}.void
10cf0 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69   (*winDlSym(sqli
10d00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
10d10 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f  oid *pHandle, co
10d20 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f  nst char *zSymbo
10d30 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55  l))(void){.  UNU
10d40 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
10d50 66 73 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  fs);.#if SQLITE_
10d60 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68  OS_WINCE.  /* Th
10d70 65 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  e GetProcAddress
10d80 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  A() routine is o
10d90 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
10da0 20 77 69 6e 63 65 2e 20 2a 2f 0a 20 20 72 65 74   wince. */.  ret
10db0 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69  urn (void(*)(voi
10dc0 64 29 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  d))GetProcAddres
10dd0 73 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  sA((HANDLE)pHand
10de0 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 23 65  le, zSymbol);.#e
10df0 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
10e00 65 72 20 77 69 6e 64 6f 77 73 20 70 6c 61 74 66  er windows platf
10e10 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
10e20 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
10e30 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 6e 73  take.  ** an Ans
10e40 69 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  i string regardl
10e50 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
10e60 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
10e70 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29   return (void(*)
10e80 28 76 6f 69 64 29 29 47 65 74 50 72 6f 63 41 64  (void))GetProcAd
10e90 64 72 65 73 73 28 28 48 41 4e 44 4c 45 29 70 48  dress((HANDLE)pH
10ea0 61 6e 64 6c 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b  andle, zSymbol);
10eb0 0a 23 65 6e 64 69 66 0a 7d 0a 76 6f 69 64 20 77  .#endif.}.void w
10ec0 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  inDlClose(sqlite
10ed0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
10ee0 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
10ef0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10f00 70 56 66 73 29 3b 0a 20 20 46 72 65 65 4c 69 62  pVfs);.  FreeLib
10f10 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61  rary((HANDLE)pHa
10f20 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
10f30 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
10f40 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
10f50 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
10f60 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
10f70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
10f80 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
10f90 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
10fa0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
10fb0 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
10fc0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
10fd0 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
10fe0 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
10ff0 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
11000 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
11010 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
11020 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
11030 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
11040 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
11050 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
11060 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
11070 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
11080 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65    n = nBuf;.  me
11090 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
110a0 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
110b0 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
110c0 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
110d0 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
110e0 0a 20 20 20 20 47 65 74 53 79 73 74 65 6d 54 69  .    GetSystemTi
110f0 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
11100 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
11110 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
11120 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
11130 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
11140 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
11150 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
11160 64 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  d = GetCurrentPr
11170 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d  ocessId();.    m
11180 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
11190 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
111a0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
111b0 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 20 20  eof(pid);.  }.  
111c0 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
111d0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
111e0 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 47 65 74   DWORD cnt = Get
111f0 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20  TickCount();.   
11200 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
11210 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
11220 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
11230 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
11240 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52    if( sizeof(LAR
11250 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75  GE_INTEGER)<=nBu
11260 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45  f-n ){.    LARGE
11270 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20  _INTEGER i;.    
11280 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
11290 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
112a0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
112b0 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29  , &i, sizeof(i))
112c0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
112d0 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  f(i);.  }.#endif
112e0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
112f0 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
11300 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
11310 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
11320 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
11330 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11340 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65   winSleep(sqlite
11350 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
11360 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 53 6c   microsec){.  Sl
11370 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  eep((microsec+99
11380 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53  9)/1000);.  UNUS
11390 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
113a0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d  s);.  return ((m
113b0 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
113c0 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  0)*1000;.}../*.*
113d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
113e0 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
113f0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
11400 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
11410 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
11420 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
11430 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
11440 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
11450 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
11460 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
11470 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
11480 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
11490 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
114a0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
114b0 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
114c0 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
114d0 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
114e0 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
114f0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
11500 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
11510 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
11520 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
11530 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
11540 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
11550 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
11560 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
11570 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
11580 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
11590 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
115a0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
115b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
115c0 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
115d0 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
115e0 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
115f0 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
11600 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
11610 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
11620 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
11630 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
11640 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
11650 65 73 73 2c 20 72 65 74 75 72 6e 20 30 2e 20 20  ess, return 0.  
11660 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
11670 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
11680 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
11690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
116a0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
116b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
116c0 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  fs, sqlite3_int6
116d0 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20  4 *piNow){.  /* 
116e0 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
116f0 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
11700 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
11710 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
11720 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
11730 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
11740 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
11750 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
11760 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46  13.5). .  */.  F
11770 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74  ILETIME ft;.  st
11780 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
11790 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65  e3_int64 winFile
117a0 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35  timeEpoch = 2305
117b0 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  8135*(sqlite3_in
117c0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
117d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
117e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
117f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
11800 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
11810 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
11820 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66  )8640000;.#endif
11830 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20  .  /* 2^32 - to 
11840 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20  avoid use of LL 
11850 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20  and warnings in 
11860 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  gcc */.  static 
11870 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
11880 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75  t64 max32BitValu
11890 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69  e = .      (sqli
118a0 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
118b0 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
118c0 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
118d0 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   + (sqlite3_int6
118e0 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69  4)294967296;..#i
118f0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
11900 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74  E.  SYSTEMTIME t
11910 69 6d 65 3b 0a 20 20 47 65 74 53 79 73 74 65 6d  ime;.  GetSystem
11920 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
11930 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
11940 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
11950 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
11960 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 53 79  ro. */.  if (!Sy
11970 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
11980 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a  me(&time,&ft)){.
11990 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
119a0 7d 0a 23 65 6c 73 65 0a 20 20 47 65 74 53 79 73  }.#else.  GetSys
119b0 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
119c0 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
119d0 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e  ..  *piNow = win
119e0 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a  FiletimeEpoch +.
119f0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28              ((((
11a00 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
11a10 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
11a20 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20  *max32BitValue) 
11a30 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
11a40 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
11a50 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  )ft.dwLowDateTim
11a60 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  e)/(sqlite3_int6
11a70 34 29 31 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  4)1000;..#ifdef 
11a80 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
11a90 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
11aa0 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
11ab0 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
11ac0 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
11ad0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
11ae0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
11af0 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
11b00 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
11b10 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
11b20 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
11b30 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
11b40 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
11b50 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
11b60 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
11b70 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
11b80 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
11b90 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
11ba0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
11bb0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
11bc0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
11bd0 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
11be0 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 77 69 6e  ound..*/.int win
11bf0 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
11c00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64  te3_vfs *pVfs, d
11c10 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
11c20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
11c30 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63  e3_int64 i;.  rc
11c40 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d   = winCurrentTim
11c50 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29  eInt64(pVfs, &i)
11c60 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20  ;.  if( !rc ){. 
11c70 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36     *prNow = i/86
11c80 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20  400000.0;.  }.  
11c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11ca0 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20  .** The idea is 
11cb0 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
11cc0 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20  on works like a 
11cd0 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a  combination of.*
11ce0 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
11cf0 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61   and FormatMessa
11d00 67 65 28 29 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ge() on windows 
11d10 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a  (or errno and.**
11d20 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e   strerror_r() on
11d30 20 75 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e   unix). After an
11d40 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
11d50 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66  ed by an OS.** f
11d60 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20  unction, SQLite 
11d70 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
11d80 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f  ion with zBuf po
11d90 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62  inting to.** a b
11da0 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79  uffer of nBuf by
11db0 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65  tes. The OS laye
11dc0 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74  r should populat
11dd0 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20  e the.** buffer 
11de0 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69  with a nul-termi
11df0 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f  nated UTF-8 enco
11e00 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ded error messag
11e10 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20  e.** describing 
11e20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f  the last IO erro
11e30 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72  r to have occurr
11e40 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
11e50 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e  lling.** thread.
11e60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72  .**.** If the er
11e70 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74  ror message is t
11e80 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65  oo large for the
11e90 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72   supplied buffer
11ea0 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62  ,.** it should b
11eb0 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65  e truncated. The
11ec0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
11ed0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a   xGetLastError.*
11ee0 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
11ef0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
11f00 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
11f10 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
11f20 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
11f30 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
11f40 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e  truncated). If n
11f50 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
11f60 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ned,.** then it 
11f70 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
11f80 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
11f90 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63  nul-terminator c
11fa0 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74  haracter.** in t
11fb0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
11fc0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70  ..**.** Not supp
11fd0 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d  lying an error m
11fe0 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65  essage will have
11ff0 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65   no adverse effe
12000 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e  ct.** on SQLite.
12010 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68   It is fine to h
12020 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74  ave an implement
12030 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72  ation that never
12040 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65  .** returns an e
12050 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a  rror message:.**
12060 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61  .**   int xGetLa
12070 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
12080 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
12090 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
120a0 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28  {.**     assert(
120b0 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a  zBuf[0]=='\0');.
120c0 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  **     return 0;
120d0 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f  .**   }.**.** Ho
120e0 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f  wever if an erro
120f0 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70  r message is sup
12100 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62  plied, it will b
12110 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a  e incorporated.*
12120 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f  * by sqlite into
12130 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
12140 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ge available to 
12150 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a  the user using.*
12160 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  * sqlite3_errmsg
12170 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b  (), possibly mak
12180 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61  ing IO errors ea
12190 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a  sier to debug..*
121a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
121b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
121c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
121d0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
121e0 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
121f0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
12200 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73  .  return getLas
12210 74 45 72 72 6f 72 4d 73 67 28 6e 42 75 66 2c 20  tErrorMsg(nBuf, 
12220 7a 42 75 66 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  zBuf);.}..../*.*
12230 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64  * Initialize and
12240 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   deinitialize th
12250 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12260 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  em interface..*/
12270 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
12280 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74  init(void){.  st
12290 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
122a0 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20   winVfs = {.    
122b0 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
122c0 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
122d0 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
122e0 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20  inFile),     /* 
122f0 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
12300 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20  MAX_PATH,       
12310 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61       /* mxPathna
12320 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12340 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
12350 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
12360 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
12370 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
12380 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
12390 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
123a0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
123b0 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
123c0 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
123d0 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
123e0 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
123f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
12400 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
12410 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
12420 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
12430 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
12440 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
12450 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
12460 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
12470 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
12480 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
12490 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
124a0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
124b0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
124c0 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
124d0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
124e0 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
124f0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
12500 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
12510 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
12520 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
12530 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
12540 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
12550 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
12560 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
12570 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
12580 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
12590 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
125a0 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  me */.    winCur
125b0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
125c0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
125d0 74 36 34 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 73  t64 */.  };..  s
125e0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
125f0 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
12600 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12610 5f 4f 4b 3b 20 0a 7d 0a 69 6e 74 20 73 71 6c 69  _OK; .}.int sqli
12620 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
12630 7b 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  { .  return SQLI
12640 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
12650 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
12660 4e 20 2a 2f 0a                                   N */.